介绍

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有序的实现和源码分析的更多相关文章

  1. JAVA中使用alibaba fastjson实现JSONObject、Object、Json字符串的转换

    JAVA中使用alibaba fastjson实现JSONObject.Object.Json字符串的转换 Object转JSON字符串:String jsonStr = JSONObject.toJ ...

  2. Quartz学习--二 Hello Quartz! 和源码分析

    Quartz学习--二  Hello Quartz! 和源码分析 三.  Hello Quartz! 我会跟着 第一章 6.2 的图来 进行同步代码编写 简单入门示例: 创建一个新的java普通工程 ...

  3. 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 ...

  4. Java并发编程(七)ConcurrentLinkedQueue的实现原理和源码分析

    相关文章 Java并发编程(一)线程定义.状态和属性 Java并发编程(二)同步 Java并发编程(三)volatile域 Java并发编程(四)Java内存模型 Java并发编程(五)Concurr ...

  5. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

  6. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  7. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  8. OpenMP For Construct dynamic 调度方式实现原理和源码分析

    OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...

  9. OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析

    OPENMP FOR CONSTRUCT GUIDED 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍在 OpenMP 当中 guided 调度方式的实现原理.这个调度方式其实和 dy ...

  10. jQuery静态方法globalEval使用和源码分析

    Eval函数大家都很熟悉,但是globalEval方法却很少使用,大多数参考手册也没有相关api,下面就对其用法和源码相应介绍: jQuery.globalEval()函数用于全局性地执行一段Java ...

随机推荐

  1. pandas 根据列的值选取所有行

    原文链接:https://blog.csdn.net/changzoe/article/details/82348913 在其他论坛上看到的,原文链接如上所示.为方便记忆,原文如下所示: 选取等于某些 ...

  2. redux的三个概念与三大核心

    1.什么是redux?一个组件里可能会有很多的状态,比如控制某个内容显示的flag,从后端获取的展示数据,那么这些状态可以在自己的单个页面进行管理,也可以选择别的管理方式,redux就是是一种状态管理 ...

  3. 使用MkDocs搭建个人博客

    使用MkDocs搭建个人博客 接触编程已经好几年了,阅读了无数大佬的博客文章,但是从来没有自己写过.这其中最重要的原因当然是懒惰,觉得写博客太费时间了,对自己的帮助也不大.可是如今发现自己的记性越来越 ...

  4. RocketMQ Linux单机测试:简易快速部署指南及Dashboard控制台部署

    目录 简介 开始 下载 增加环境变量 修改启动文件jvm大小 修改rocketmq配置文件 启动 快速测试 关闭 Dashboard 下载Dashboard 已编译jar包网盘下载 启动命令 可能遇到 ...

  5. go-zero 是如何做路由管理的?

    原文链接: go-zero 是如何做路由管理的? go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分. 而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 ...

  6. DDD实践:实现基于快照机制的变更追踪

    王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 去年我们在重构项目中落地了DDD,当时花了点时间研究了下阿里巴巴大淘宝技术发布的<阿里技术专家详解 ...

  7. [ABC138F] Coincidence

    2023-02-03 题目 题目传送门 翻译 翻译 难度&重要性(1~10):6 题目来源 AtCoder 题目算法 数位dp 解题思路 \(1.\) 当 \(2x\leq y\),有\(y- ...

  8. 论文解读(TAMEPT)《A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classification》

    论文信息 论文标题:A Two-Stage Framework with Self-Supervised Distillation For Cross-Domain Text Classificati ...

  9. 避坑|在读取excel.xlsx文件中的内容时发现明明只有3行,但跑起来却认为有13行,导致有10行None,UI自动化测试代码空跑了10次;|UI自动化测试|数据驱动

    在读取excel.xlsx文件中的内容时发现明明只有3行,但跑起来却认为有13行,导致有10行None,UI自动化测试代码空跑了10次: 原因:excel.xlsx内容清除时用delete快捷键导致, ...

  10. DesignPattern-part2

    title: "modern C++ DesignPattern-Part2" date: 2018-04-10T19:08:49+08:00 lastmod: 2018-04-1 ...