介绍

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. hexo博客主题,git上传,报错Template render error的解决方案

    报错信息 INFO Start processing FATAL Something's wrong. Maybe you can find the solution here: http://hex ...

  2. 如何快速又高质量的输出PDF实验报告?

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. PDF文档的打印在很多应用场景中都会被使用到,最为常见的就是实 ...

  3. ASP.NET Core - 日志记录系统(一)

    一.日志记录 日志记录是什么?简单而言,就是通过一些方式记录应用程序运行中的某一时刻的状态,保留应用程序当时的信息.这对于我们进行应用程序的分析.审计以及维护有很大的作用. 作为程序员,我们恐怕谁也不 ...

  4. 【渗透测试】Cobalt Strike制作钓鱼邮件渗透Windows

    目标 在kali中使用Cobalt Strike制作钓鱼邮件,对Windows进行渗透 机器环境 kali(服务端):192.168.175.129 win11(攻击机):192.168.175.12 ...

  5. 【技术实战】Vue技术实战【四】

    需求实战一 效果展示 代码展示 <template> <ARow> <ACol> <a-statistic-countdown :value="de ...

  6. DHorse v1.3.0 发布,基于k8s的发布平台

    综述 DHorse是一个简单易用.以应用为中心的云原生DevOps系统,具有持续集成.持续部署.微服务治理等功能,无需安装依赖Docker.Maven.Node等环境即可发布Java.Vue.Reac ...

  7. 简述分布式链路追踪工具——Jaeger

    1.简介 1.1 Jaeger是什么 Jaeger  是受到 ​ ​Dapper​​​ 和 ​ ​OpenZipkin​​​ 启发的由 ​ ​Uber Technologies​​ 作为开源发布的分布 ...

  8. Day11:KMP、字典树、AC自动机、后缀数组、manacher

    KMP算法 前言 KMP算法是一个著名的字符串匹配算法,效率很高,但是确实有点复杂. 简介 KMP 算法是 D.E.Knuth.J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 ...

  9. 并发工具类Phaser

    前言 在面试这一篇我们介绍过CountDownLatch和CyclicBarrier,它们都是jdk1.5提供的多线程并发控制类,内部都是用AQS这个同步框架实现. 在我们的实际项目中,有很多场景是需 ...

  10. windows和linux键值表

    windows系统下对应键值 {8,KEY_BACKSPACE}, {9,KEY_TAB}, {13,KEY_ENTER}, {16,KEY_LEFTSHIFT}, {17,KEY_LEFTCTRL} ...