alibaba fastjson的JsonObject有序的实现和源码分析
介绍
FastJson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。在使用的过程中,因为有序性问题导致踩了坑,看一下其底层源码,了解其有序性上的实现。
分析1:
JSONObject inputInfo = manifestDraftObj.getJSONObject("inputInfo");
这里在使用的时候,以为get出来的数据是引用关系的,修改会影响到原先Object里面的数据,但实际情况并不是这样子通过get拿到的object,对这个object的修改不会影响到原先那个object,get到的object是复制出来的,可以在JSON类里面的toJSON(Object javaObject, SerializeConfig config)方法看到,新new了个JSONObject,且内部是linkedHasMap,最终返回的是这个拷贝出来的Map。

通过上述代码拿到的object,其实其内部已经linkedHashMap的有序Map了
至于为什么默认是有序的LinkedHashMap,追源码看一看

当一个请求进来,我们的系统会使用反射去调用url下指定的controller的method,同时会对参数进行初始化,会根据参数指定的类型进行初始化,这里会进入MapDeserializer类,并且在这里面执行deserialize()方法,生成我们当前需要的JSONObject,且是LinkedHashMap的,如下图:

在这里,调用了_readAndBindStringKeyMap后,会将我们需要的JSONObject存到result里面,并返回,进入这个方法看一看,这个方法会在valueDes.deserialize(p,ctxt)进行map的生成和组装。

进入valueDes.deserialize(p,ctxt)方法,可以看到LinkedHashMap的创建和赋值

自此参数生成完毕,回到我们最开始的jsonobject的getObject方法,现在我们明白为什么会是LinkdedHashMap了,在这里(map instanceof LinkedHashMap)条件会成立,进入赋值和创建。

分析2:
JSON.parseObject(manifestDraft.getInputDraft() , Feature.OrderedField)
parseObject默认返回的是无序的map,要得到有序需要加Feature.OrderedField
部分源码上的分析:
使用上述代码,会进入到DefaultJSONParser,在这里创建有序的JSONObject

在new JSONObject的时候,会进入JSONObject的构造方法,最后创建出个LinkedHashMap

最后来到parseObject方法,完成填值

alibaba fastjson的JsonObject有序的实现和源码分析的更多相关文章
- JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换
JAVA中使用alibaba fastjson实现JSONObject.Object.Json字符串的转换 Object转JSON字符串:String jsonStr = JSONObject.toJ ...
- Quartz学习--二 Hello Quartz! 和源码分析
Quartz学习--二 Hello Quartz! 和源码分析 三. Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...
- Android Debuggerd 简要介绍和源码分析(转载)
转载: http://dylangao.com/2014/05/16/android-debuggerd-%E7%AE%80%E8%A6%81%E4%BB%8B%E7%BB%8D%E5%92%8C%E ...
- Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析
相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...
- Kubernetes Job Controller 原理和源码分析(一)
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
- Kubernetes Job Controller 原理和源码分析(二)
概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...
- Kubernetes Job Controller 原理和源码分析(三)
概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...
- OpenMP For Construct dynamic 调度方式实现原理和源码分析
OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...
- OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析
OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中 guided 调度方式的实现原理.这个调度方式其实和 dy ...
- jQuery静态方法globalEval使用和源码分析
Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...
随机推荐
- Vortex Indicator 构建交易策略
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 今天的文章,我们将为大家介绍一个与DMI(Directional Movement Index)类似,判 ...
- 【工具推荐】github打不开or加载慢?不用配置hosts,教你一键加速!
不说废话 下载watt toolkit(原名steam++) 官方地址: Watt Toolkit - 瓦特工具箱(Steam++官网) (steampp.net) 安装完后选中,点击一键加速即可. ...
- node:spawn npm ENOENT
错误背景 封装脚手架时报错 错误原因 windows系统原因 解决方案 const createProjectAction = async (project) => { console.log( ...
- 二 APPIUM Android自动化 环境搭建(转)
1.安装JAVA运行环境 2.安装Android开发环境 3.安装nodejs 下载地址:https://nodejs.org/en/ 下载完成之后双击安装. 4.安装APPIUM,Appium服务端 ...
- 避坑 | OI排雷新生态
可持久化线段树 query 的时候两结点的 sz 相减的时候一定是左儿子相减. 可持久化线段树建新点要将原来的不更改的节点连接上. 动态规划也可以倒着考虑. P3957的单调队列是先加入后删除,否则加 ...
- 使用wrk对api接口进行性能测试
安装 yum install -y openssl git git clone https://github.com/wg/wrk.git wrk cd wrk make cp wrk /usr/lo ...
- SpringSecurity1: spring boot web 样例快速体验
本文只讲操作实践,不讲原理,这样对于想快速搭建起一个基于SpringSecurity的Web项目的朋友们而言,比较友好.文章主要由两部分构成: 快速演示样例 所有账户和授权数据均基于内存,能在极短的时 ...
- 10、Mybatis之缓存
10.1.环境搭建 10.1.1.创建新module 创建名为mybatis_cache的新module,过程参考5.1节 10.1.2.创建Mapper接口和映射文件 package org.rai ...
- centos7.X安装mysql5.7 – 东凭渭水流
1.下载mysql5.7 可以使用windows下载好后上传至Linux.网络条件好的推荐使用 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/m ...
- Go 并发编程 - runtime 协程调度(三)
Go Runtime Go runtime 可以形象的理解为 Go 程序运行时的环境,类似于 JVM.不同于 JVM 的是,Go 的 runtime 与业务程序直接打包在一块,是一个可执行文件,直接运 ...