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);
		else
			appendBean(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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值