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

  

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

时间: 2024-11-08 10:20:11

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

bootstarp_项目实战__瓢城企业(注释+源码)

源代码下载地址:http://pan.baidu.com/s/1gfI9Pj9 /********************************* pc界面设备页面******************************************/ /*** ******************************移动设备页面******************************************/ [作者]:轻轻走143 [出处]:http://www.cnblogs.co

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-2项目说明和源码下载

本文目录1. 摘要2. Window下运行 3.linux下运行4. 开发记录5. 总结 1.概要 写<Asp.Net Core 2.0 项目实战>系列断断续续已经很长时间了,期间很多朋友要求开放源码,但是项目代码一直有很多问题,就算勉强开源出来大家看起来也比较费劲,运行起来也看不到实际的效果.在公司平时真的是太忙了,很少有时间去系统的整理一个框架,只能以学习这种形式边学边做.承诺大家开源出来此项目我做到了,虽然项目依然有很多问题,我接下来会再完善.功能暂时不会再增加了,暂时先做到权限管理,以

第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析

王家林亲授<DT大数据梦工厂>大数据实战视频“Scala深入浅出实战经典”视频.音频和PPT下载!第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析百度云:http://pan.baidu.com/s/1pJ5jzHx腾讯微云:http://url.cn/aSawrm360云盘:http://yunpan.cn/cctL3QYACaVNa  访问密码 c0fb 信息来源于 DT大数据梦工厂微信公众账号:DT_Spark

Scala深入浅出实战经典《第83讲:Scala中List的实现内幕源码揭秘》笔记

终于从暑假回到正常的日子了~虽然开始学习<scala深入浅出实战经典>这门课程有些晚了,但是不管如何既然开始了,坚持下去才是重点.下面言归正传. 第83讲:Scala中List的实现内幕源码揭秘 Goal:List实现关键源码分析 Gains: 1)List中的诸多方法其实还是采用ListBuffer来实现的,而后ListBuffer利用toList返回不可变的List. 2)采用ListBuffer,效率较高:而toList方法返回List,也只是耗常量时间,并不会很大程度地影响性能. Q:

【141029】VC游戏编写中的求解最短路径算法源码

VC游戏编写中的求解最短路径算法源码,本示例是自动寻径演示,篮点是起点,红点是终点,按确定键开始.源码爱好者注:编译后运行的时候请把EXE文件从Debug目录中拷贝到项目根目录中,若不然会出错. 编著.程序设计:唐明理 程序顺序: 初始化队列.待处理节点入队列, 依靠对目的地估价距离插入排序,将离目的地估计最近的方案出队列,释放栈顶节点,释放申请过的所有节点,估价函数,估价 x,y 到目的地的距离,估计值必须保证比实际值小, 尝试下一步移动到 x,y 可行否,如果曾经有更好的方案移动到 (x,y

在Android Studio中为jar添加source源码

下面的步骤将介绍如何在Android Studio中为jar库绑定源码!!! 1. 在build.gradle中添加jar依赖: dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])               //针对libs下的.jar库 compile files('libs/xxxx.Final.jar')                            // 针对指定文件 } 2. Rebuild后点进j

在eclipse中查看HttpServlet源码失败的解决方法

在初次建立java EE 项目时,想要查看HttpServlet源码时会提示失败, 按照网上的方式,将Tomcat中lib中的servlet-api.jar的包导进去,发现并不管用.并且提示里面并不包括HttpServlet源码. 因此,试着在Apache官方网站中下载对应的Tomcat的源码 然后在错误的页面添加下载好的包导入进去即可.

Android中AsyncTask基本用法与源码分析(API 23)

原文链接 http://sparkyuan.github.io/2016/03/23/AsyncTask源码剖析(API 23)/ 转载请注明出处 Android的UI是线程不安全的,想在子线程中更新UI就必须使用Android的异步操作机制,直接在主线程中更新UI会导致程序崩溃. Android的异步操作主要有两种,AsyncTask和Handler.AsyncTask是一个轻量的异步类,简单.可控.本文主要结合API 23的源码讲解一下AsyncTask到底是什么. 基本用法 声明:Andr

caffe中HingeLossLayer层原理以及源码分析

输入: bottom[0]: NxKx1x1维,N为样本个数,K为类别数.是预测值. bottom[1]: Nx1x1x1维, N为样本个数,类别为K时,每个元素的取值范围为[0,1,2,-,K-1].是groundTruth. 输出: top[0]: 1x1x1x1维, 求得是hingeLoss. 关于HingeLoss: p: 范数,默认是L1范数,可以在配置中设置为L1或者L2范数. :指示函数,如果第n个样本的真实label为k,则为,否则为-1. tnk: bottom[0]中第n个样