各种json工具包的比较:

JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统。

目前对于Java开源的JSON类库有很多种,下面我们取三个常用的JSON库进行性能测试对比,同时根据测试结果分析如果根据实际应用场景选择最合适的JSON库。

四个JSON类库分别为:Gson,FastJson,Jackson,Json-lib。

简单介绍下四个类库的身份背景。

Gson(项目地址:https://github.com/google/gson)。Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。

FastJson(项目地址:https://github.com/alibaba/fastjson)。Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

Jackson(项目地址:https://github.com/FasterXML/jackson)。相比json-lib框架,Jackson所依赖的jar包较少,简单易用并且性能也要相对高些。而且Jackson社区相对比较活跃,更新速度也比较快。Jackson对于复杂类型的json转换bean会出现问题,一些集合Map,List的转换出现问题。Jackson对于复杂类型的bean转换Json,转换的json格式不是标准的Json格式。

Json-lib(项目地址:http://json-lib.sourceforge.net/index.html)。json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷,比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。

选择一个合适的JSON库要从多个方面进行考虑:

字符串解析成JSON性能

字符串解析成JavaBean性能

JavaBean构造JSON性能

集合构造JSON性能

易用性

对于前四条其实都是从JSON的解析构造性能角度考虑,而最后一条则是考虑易用性,这点对于开发者来说其实也是需要考虑的一个问题,如果该库的API使用难度大,或者很复杂,那么不建议使用,毕竟JSON解析的性能差异并不大。下面的测试结果针对四个不同数量级的JSON字符串,以及分别测试上面提到的前四条性能,结果如下:

Json-lib在数据量在10W时OOM了,内存开到1G都不行,所以直接Pass了。

从上面图表可以看到:

字符串解析成JavaBean:当数据量较少时首选FastJson,数据量较大使用Jackson。但是Jackson无法堆一个对象集合进行解析,只能转成一个Map集合,这点Gson和FastJson处理的比较好。

字符串解析成JSON:当数据量较少时首选FastJson,数据量较大使用Jackson。

JavaBean构造JSON:当数据量较少时选择Gson,数据量较大可使用Jackson。

集合构造JSON:首先Jackson,其次Fastjson。

上面是从性能角度分析四种JSON类库,从易用性角度来分析的话,FastJson的API设计的最简单,最方便使用,直接使用JSON的两个静态方法即可完成四种操作;而Gson和Jackson都需要new一个对象,虽然这个对象可以复用,但是在实际使用过程中还需要用一个全局变量来保存改变量,同时API设计的也不是很好理解,对于FastJson来说复杂的API是因为他支持流式解析,适合对JSON进行大量且复杂的操作,但是实际应用中对于JSON的操作都是简单的解析成JavaBean,然后JavaBean序列化成JSON字符串即可,复杂的操作很少。

下面从我自己实际的应用场景出发,考虑该如何选择合适的JSON类库。

应用场景:游戏服务器,基本是对客户端发送过来的JSON格式字符串解析成JavaBean,然后将封装好的指令转成JSON字符串返回给客户端,这里考虑到JavaBean转成JSON与集合转成JSON的性能差异,所以直接使用集合进行转成JSON,避免使用JavaBean。

考虑上述场景适合使用FastJson进行JSON字符串解析,Jackson将集合转成JSON格式字符串。

各种json工具包的比较相关推荐

  1. 各种json工具包的比较:

    各种json工具包的比较: JSON不管是在Web开发还是服务器开发中是相当常见的数据传输格式,一般情况我们对于JSON解析构造的性能并不需要过于关心,除非是在性能要求比较高的系统. 目前对于Java ...

  2. springboot配置JSON,引入JSON工具包

    1,需要用到JSON工具包的话在pom.xm文件中导入以下文件 <!-- 引入StringUtils工具类--><dependency><groupId>commo ...

  3. java jackson包_java json工具包Jackson的使用

    官方的五分钟入门文档: 国内某位同仁的翻译版(算是翻译版吧) 除了这些简单的应用外,有时还会遇到一些比较特殊的场景 pojo的字段名与实际的属性名不一样 某些属性不需要作json转换 字段以指定的顺序 ...

  4. json从立地到成佛

    文章目录 诞生于JavaScript,json的前世今生 json含义 json诞生 搞清json兄弟姐妹,看清区别 json VS xml 小小翻译官,json的应用 前端ajax+json异步传输 ...

  5. xml 文本转json java_java将XML文档转换成json格式数据

    本篇文章主要介绍了java将XML文档转换成json格式数据的示例,希望能帮助到大家. 功能 将xml文档转换成json格式数据 说明 依赖包: 1. jdom-2.0.2.jar : xml解析工具 ...

  6. C++和Python,JSON文件的读取和保存

    1. Python python很简单,因为python自带json包,所以只要import就可以,具体使用如下. import json#保存json文件 root = {'Exp':[], 'Ex ...

  7. 数组转json去除首尾引号_诞生于JavaScript,json的前世今生

    诞生于JavaScript,json的前世今生 json含义 在开始之前,问个问题,什么是json? a:我猜它应该是某一门高深的技术(语重心长) b:json这个词为啥谷歌翻译?是啥新词语嘛?是不是 ...

  8. JSON 序列化 与 反序列化

    JavaScript中:JSON对象 与 JSON字符串 的转换 JSON.parse() 用于将JSON字符串 转换成 JSON对象 JSON.stringify() 用于将JSON对象 转换成 J ...

  9. C# json解析字符串总是多出双引号_json从立地到成佛

    本文原创作者bigsai(同公众号),本文以浅显易懂的方式给大家讲解自己所认知的json,如果有错误或者不准确地方还请大家给出指正,另外本文以关卡课程的方式在博学谷也是免费开放的,大家也可通过关卡方式 ...

最新文章

  1. CodeForces 689B Mike and Shortcuts (bfs or 最短路)
  2. 年轻人(以我为例)最应该做的事情(个人观点)
  3. Python paho-mqtt消息队列
  4. 如何让手机1秒打开健康码 ,任何机型!
  5. jquery获取input值
  6. TreeSet(不可重复,自动排序)实现自定义排序
  7. 【方案分享】抖音平台新媒体百问百答:平台规则、爆款涨粉、运营技巧、内容变现.pdf(附下载链接)...
  8. 亚信科技公布2019年度业绩,5G商用效果凸显
  9. java向mysql插入数据乱码问题解决
  10. php 拷贝文件至新目录,如何查找到文件以后,带目录一起拷贝到新的目录? cp --parents source destination...
  11. C语言课设----个人信息管理系统(包含学生成绩和消费记录)
  12. 康拓电梯卡延期与通楼修改教程
  13. X230 安装 EI Capitan 10.11.5 驱动篇
  14. 3dmax贴图材料丢失如何恢复
  15. 《QTreeView+QAbstractItemModel自定义模型》:系列教程之三
  16. 微信小程序插件安装Vant有赞组件库
  17. java javaw 命令区别_java.exe和javaw.exe有什么区别
  18. ad中那个快捷键是重复上一部_Rhino快速建模(快捷键和快捷键的巨集的建立)...
  19. QQ浏览器网页版微信抓包和IPAD微信抓包 Wireshark
  20. 入职百度第二周,我知道了这些

热门文章

  1. 计算机集成过程系统的现状及发展,信息系统集成的现状与未来发展
  2. 有趣的个人云平台 – Sandstorm
  3. echarts+vue——散点图+折线图——技能提升
  4. 根据ip查询地理位置
  5. 小凯的疑惑(扩展欧几里得)
  6. Python调用阿里云数据库监控数据
  7. 在当前文件夹下创建以日期和时间命名的文件夹
  8. oppo reno5和oppo reno4se哪个好有什么区别 oppo reno5和oppo reno4se参数对比哪款更值得入手
  9. ssm+vue+elementUI 智能新冠疫苗接种预约助手-#毕业设计
  10. sublime3不支持GBK导致中文乱码