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

Posted 进无止境

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastJson遇见的问题或项目实战中优化的问题,看源码都可以解决相关的知识,希望对你有一定的参考价值。

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遇见的问题或项目实战中优化的问题,看源码都可以解决的主要内容,如果未能解决你的问题,请参考以下文章

Spark 实战系列Spark 使用 BulkLoad 同步数据到 hbase 排序优化

Spark 实战系列Spark 使用 BulkLoad 同步数据到 hbase 排序优化

手把手ios苹果打包——遇见项目实战|超详细的教程分享

接口优化的常见方案实战总结

执行3小时超长SQL的分析优化过程:从索引遇见IS NULL,到最佳实践

Java项目中的常用的异常2