场景

笔者发现后端对网页提供的json接口数据,都不是特别复杂,所以为了提高json的转换效率,在笔者自己写的struts-1.0.0框架里,自主实现了一个map转json的类(内部返回值都是map封装),效率非常高(基本不会超过1ms),望大家批评指正。

调用方式

HashMap<String, Object> jsonMap = new HashMap<>();
jsonMap.put("ss", 123);
jsonMap.put("user", new User());
JSONWrapper wrapper = new JSONWrapper ();
wrapper.write(jsonMap);

具体实现:

package com.github.yydf.struts.wrapper;import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;public class JSONWrapper {private static final String COMMA = ",";private static final String MARKS = "\"";private static final String COLON = ":";private static final String BRACKET_LEFT = "[";private static final String BRACKET_RIGHT = "]";private static final String BRACE_LEFT = "{";private static final String BRACE_RIGHT = "}";private static final String STR_VERSION_UID = "serialVersionUID";final StringBuilder json = new StringBuilder();public String write(Map<String, Object> jsonMap) {try {appendMap(jsonMap);} catch (RuntimeException e) {e.printStackTrace();}return json.toString();}private void appendMap(Map<String, Object> map) {json.append(BRACE_LEFT);Iterator<String> keys = map.keySet().iterator();while (keys.hasNext()) {String key = keys.next();appendObj(key, map.get(key), keys.hasNext());}json.append(BRACE_RIGHT);}private void appendObj(String key, Object obj, boolean hasNext) {if (obj == null || STR_VERSION_UID.equals(key))return;if (key != null)json.append(MARKS).append(key).append(MARKS).append(COLON);if (isNumber(obj))appendNum(obj);else if (isString(obj))appendString(obj.toString());else if (isArray(obj))appendArray(obj);else if (isList(obj))appendList((List<?>) obj);else if (isMap(obj))appendMap2((Map<?, ?>) obj);elseappendBean(obj);if (hasNext)json.append(COMMA);}private void appendBean(Object obj) {json.append(BRACE_LEFT);Map<String, Object> map = getBeanValue(obj);Iterator<String> keys = map.keySet().iterator();String key;while (keys.hasNext()) {key = keys.next();appendObj(key, map.get(key), keys.hasNext());}json.append(BRACE_RIGHT);}private static Map<String, Object> getBeanValue(Object obj) {Map<String, Object> map = new HashMap<>();try {Field[] fields = obj.getClass().getDeclaredFields();Object obj2;for (Field field : fields) {field.setAccessible(true);obj2 = field.get(obj);field.setAccessible(false);if (obj2 != null)map.put(field.getName(), obj2);}} catch (IllegalArgumentException | IllegalAccessException e) {//logger.error("getBeanValue faild", e);}return map;}private void appendMap2(Map<?, ?> map) {json.append(BRACKET_LEFT);Iterator<?> keys = map.keySet().iterator();while (keys.hasNext()) {String key = (String) keys.next();appendObj(key, map.get(key), keys.hasNext());}json.append(BRACKET_RIGHT);}private void appendList(List<?> list) {json.append(BRACKET_LEFT);int len = list.size();for (int i = 0; i < len; i++) {appendObj(null, list.get(i), i != (len - 1));}json.append(BRACKET_RIGHT);}private void appendArray(Object obj) {json.append(BRACKET_LEFT);int len = Array.getLength(obj);for (int i = 0; i < len; i++) {appendObj(null, Array.get(obj, i), i != (len - 1));}json.append(BRACKET_RIGHT);}private void appendNum(Object obj) {json.append(obj);}private void appendString(String str) {if (str.indexOf("\n") != -1)str = str.replaceAll("\\n", "\\\\n");if (str.indexOf("\t") != -1)str = str.replaceAll("\\t", "\\\\t");if (str.indexOf("\r") != -1)str = str.replaceAll("\\r", "\\\\r");json.append(MARKS).append(str).append(MARKS);}private static boolean isMap(Object obj) {return obj instanceof Map;}private static boolean isList(Object obj) {return obj instanceof List;}private static boolean isArray(Object obj) {return obj.getClass().isArray();}private static boolean isString(Object obj) {return obj instanceof CharSequence || obj instanceof Character;}private static boolean isNumber(Object obj) {return obj instanceof Integer || obj instanceof Boolean || obj instanceof Double || obj instanceof Long|| obj instanceof Byte || obj instanceof Float || obj instanceof Short;}}

源码传送门(如果你觉得不错,就点个star吧):

https://github.com/yydf/struts

java自定义高效map转json逻辑实现相关推荐

  1. java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...

    Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...

  2. java 自定义json解析注解 复杂json解析 工具类

    java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...

  3. java 自定义map_自定义写实现java中map中的功能(简易)

    package test; /** * 通过自定义来实现一个map功能 * 存放键值对,根据键对象找到一个值对象,确保没有重复 */ import java.util.Map; public clas ...

  4. java处理json的工具类(list,map和json的之间的转换)

    需要下载第三方的jar :net.sf.json import java.io.BufferedReader; import java.io.InputStream; import java.io.I ...

  5. java map转JSON对象

    java map转JSON对象 net.sf.json.JSONObject.fromObject(map)

  6. java中map转json

    在日常的使用中,我们一般会遇到map转json,如果遍历的话会浪费大量的时间,其实我们拥有这样的jar包 The method *** is undefined for the type JSONOb ...

  7. Java笔记-通过放射获取类中成员名及调用get方法及map构造JSON数据

    目录 通过反射获取类中成员名 通过反射调用get方法 map生成JSON数据 通过反射获取类中成员名 /*** 获取类中的所有成员名* @param currentClass* @return* @t ...

  8. Java中将Map转换为JSON

    一个注意的地方:要选对jar包 Map map = new HashMap();map.put("success", "true");map.put(" ...

  9. java的map转json字符串

    Map<String,String> paramMap = new HashMap<>(); JSONObject object = new JSONObject(map); ...

最新文章

  1. (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
  2. Newtonsoft.Json code
  3. 某电世界------青龙面板
  4. sepFilter2D函数
  5. 本周测试服务器角色转移系统仅开放转入,5月24日维护公告 角色转移系统全服放出...
  6. [转载]地球物理经典书目——成像方向
  7. Java中this的简单应用
  8. LINQ简记(1):基本语法
  9. oracle 删除补全日志组_Oracle 10g 添加、删除日志组
  10. android 上下滑动重影
  11. 东北大学计算机期末考试题,东北大学计算机组成原理题库(10)
  12. Vivado18.3的安装 安装教程
  13. 医疗系统流程软件测试用例,医疗管理系统案例测试用例.doc
  14. hadoop实现单词统计
  15. 计算机能力考试合格证(5个模块),全国专业技术人员计算机应用能力考试
  16. Web—13-判断网站请求来自手机还是pc浏览器
  17. Creating a universal SNP and small indel variant caller with deep neural networks理解
  18. xcode反汇编调试iOS模拟器程序
  19. php重置网页按钮,html中递交按钮和重置按钮代码,要怎么输入?
  20. VR中的9轴传感器(重力加速度/陀螺仪/磁力计)

热门文章

  1. 拼多多子账号怎样设置?别人可操作吗
  2. Centos7常用命令合集
  3. 网易云音乐等级快速升级 - 每天打卡听歌300首
  4. 网络--keytool自签名SSL证书(免费)以及私钥签名、公钥验签
  5. dell台式机进入安全模式_戴尔电脑如何进入安全模式
  6. SSMS Sql Server 身份验证(设置用户名和密码)方式登录
  7. SSM+停车管理系统 毕业设计-附源码171046
  8. Android绘图之Canvas变换(6)
  9. java逻辑测试题_《Java理解程序逻辑试题分析》
  10. 全球与中国4-叔戊基苯酚市场深度研究分析报告