java自定义高效map转json逻辑实现
场景:
笔者发现后端对网页提供的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逻辑实现相关推荐
- java中map转为json数据_Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回...
Java技术-将java中Map类型数据转化为json数据并以Ajax形式返回html 1.自定义工具类(简单易用)-下面是我写的一个简单的工具类前端 package com.test.util; i ...
- java 自定义json解析注解 复杂json解析 工具类
java 自定义json解析注解 复杂json解析 工具类 目录 java 自定义json解析注解 复杂json解析 工具类 1.背景 2.需求-各式各样的json 一.一星难度json[json对象 ...
- java 自定义map_自定义写实现java中map中的功能(简易)
package test; /** * 通过自定义来实现一个map功能 * 存放键值对,根据键对象找到一个值对象,确保没有重复 */ import java.util.Map; public clas ...
- java处理json的工具类(list,map和json的之间的转换)
需要下载第三方的jar :net.sf.json import java.io.BufferedReader; import java.io.InputStream; import java.io.I ...
- java map转JSON对象
java map转JSON对象 net.sf.json.JSONObject.fromObject(map)
- java中map转json
在日常的使用中,我们一般会遇到map转json,如果遍历的话会浪费大量的时间,其实我们拥有这样的jar包 The method *** is undefined for the type JSONOb ...
- Java笔记-通过放射获取类中成员名及调用get方法及map构造JSON数据
目录 通过反射获取类中成员名 通过反射调用get方法 map生成JSON数据 通过反射获取类中成员名 /*** 获取类中的所有成员名* @param currentClass* @return* @t ...
- Java中将Map转换为JSON
一个注意的地方:要选对jar包 Map map = new HashMap();map.put("success", "true");map.put(" ...
- java的map转json字符串
Map<String,String> paramMap = new HashMap<>(); JSONObject object = new JSONObject(map); ...
最新文章
- (pytorch-深度学习系列)pytorch卷积层与池化层输出的尺寸的计算公式详解
- Newtonsoft.Json code
- 某电世界------青龙面板
- sepFilter2D函数
- 本周测试服务器角色转移系统仅开放转入,5月24日维护公告 角色转移系统全服放出...
- [转载]地球物理经典书目——成像方向
- Java中this的简单应用
- LINQ简记(1):基本语法
- oracle 删除补全日志组_Oracle 10g 添加、删除日志组
- android 上下滑动重影
- 东北大学计算机期末考试题,东北大学计算机组成原理题库(10)
- Vivado18.3的安装 安装教程
- 医疗系统流程软件测试用例,医疗管理系统案例测试用例.doc
- hadoop实现单词统计
- 计算机能力考试合格证(5个模块),全国专业技术人员计算机应用能力考试
- Web—13-判断网站请求来自手机还是pc浏览器
- Creating a universal SNP and small indel variant caller with deep neural networks理解
- xcode反汇编调试iOS模拟器程序
- php重置网页按钮,html中递交按钮和重置按钮代码,要怎么输入?
- VR中的9轴传感器(重力加速度/陀螺仪/磁力计)