码迷,mamicode.com
首页 > Web开发 > 详细

FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决

时间:2018-04-16 12:09:46      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:text   global   ret   eof   ring   task   out   serial   hand   

1:感觉见鬼了一般存储JSONObject中的字段竟然不见了? 

 

        JSONObject object=new JSONObject();
        Map fields = new HashMap();
        fields.put("1","1");
        object.put("fields",fields);
        System.out.println(object.toString());
        JSONObject newFields = object.getJSONObject("fields");
        newFields.put("2",2);
        //TODO  序列化字符串没有2?!!
        // 看源码便可以知晓,当我们使用Map当做JSONObject解析时候,Fastjson会返回一个新的对象
        System.out.println(object.toString());

  

com.alibaba.fastjson.JSON#toJSON(java.lang.Object, com.alibaba.fastjson.serializer.SerializeConfig)源码:

 public static Object toJSON(Object javaObject, SerializeConfig config) {
        if (javaObject == null) {
            return null;
        }

        if (javaObject instanceof JSON) {
            return javaObject;
        }

        if (javaObject instanceof Map) {
            Map<Object, Object> map = (Map<Object, Object>) javaObject;
        // 创建了一个新的JSONObject返回了
            JSONObject json = new JSONObject(map.size());

            for (Map.Entry<Object, Object> entry : map.entrySet()) {
                Object key = entry.getKey();
                String jsonKey = TypeUtils.castToString(key);
                Object jsonValue = toJSON(entry.getValue());
                json.put(jsonKey, jsonValue);
            }

            return json;
        }

  

2:当我们使用JSONArray时候,有些时候里面可能存储较大量的数据,但是有些场景需要在指定index处进行insert操作,这时由于JSONArray默认底层使用的是ArrayList存储,因此存在性能问题,那么是否可以使用LinkedList呢?答案可以的:

 JSONArray arr = new JSONArray(new LinkedList());

  

3:当我们查询接口获取到一个JSONArray字符串想反序列化时候可否将底层存储的ArrayList使用LinkedList替换呢?答案:可以,修改一下源码或者添加一个重载方法即可。

 public static JSONArray parseArray(String text) {
        if (text == null) {
            return null;
        }

        DefaultJSONParser parser = new DefaultJSONParser(text, ParserConfig.getGlobalInstance());

        JSONArray array;

        JSONLexer lexer = parser.lexer;
        if (lexer.token() == JSONToken.NULL) {
            lexer.nextToken();
            array = null;
        } else if (lexer.token() == JSONToken.EOF) {
            array = null;
        } else {
//            array = new JSONArray(new ArrayList());
            array = new JSONArray(new LinkedList());
            parser.parseArray(array);

            parser.handleResovleTask(array);
        }

        parser.close();

        return array;
    }

  

 

FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决

标签:text   global   ret   eof   ring   task   out   serial   hand   

原文地址:https://www.cnblogs.com/leodaxin/p/8854951.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!