java map转json servlet response

1、手写一个map转json的类

  1.1 调用方式

        //给前端放回json数据
        Map<String, Object> map = new HashMap<>();
        map.put("name", "bb");
        map.put("age", "cc");
        map.put("good", "dd");

        JSONWrapper  wap = new JSONWrapper();
        String data = wap.write(map);
        System.out.println(data);

  1.2 封装的类

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;
    }

}

猜你喜欢

转载自www.cnblogs.com/wuzaipei/p/10521466.html
今日推荐