Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了。我们很少会去想用到的这些JSON库到底有什么不同,但事实上它们的确是不太一样的。因此,我们运行了一个基准测试来对常用的几个JSON库进行了测试,看看在解析不同大小的文件时哪个库的速度是最快的。下面我会把结果分享给大家。

JSON通常用于传输及解析大文件。这对运行在Hadoop或者是Spark集群上的数据处理程序而言是个很常见的场景。在给定的文件大小下,你可以看到不同库之间的解析速度存在着明显的差别。

高吞吐量的情况下,会频繁地传输并解析小文件,因此一开始的时候可能性能的差距并不明显。但如果你需要在非常高负载下频繁地解析大量的小文件,差距就开始增大了。微服务及分布式架构经常会使用JSON来传输此类文件,因为这已经是WEB API的事实标准。

不是所有的JSON库都叫"特仑苏"。如何根据使用场景才选择正确的库是相当重要的。希望这个基准测试能够对你有所帮助。

JSON.simple vs GSON vs Jackson vs JSONP

我们选择了四个主流的JSON库来进行基准测试:JSON.simple, GSON, Jackson以及JSONP。在Java中进行JSON解析通常都会用到这几个库,选择它们的原因是它们在Github项目中的亮相频率很高。

下面便是我们所测试的JSON库:

  • Yidong Fang的JSON.simple(https://github.com/fangyidong/json-simple)。JSON.simple是一个JSON编解码的Java工具库。它旨在打造一个轻量简单且高性能的工具库。
  • Google的GSON(https://github.com/google/gson)。GSON这个Java库能够在Java对象和JSON间进行相互转换。同时它还提供了对Java泛型的完整支持,而且还不需要你在类上面添加注解。无需添加注解使用起来则更为便捷,同时在无法修改源代码的情况下这还是一个必要的先决条件。
  • FasterXML的Jackson项目(https://github.com/FasterXML/jackson)。Jackson是一个数据处理的工具套件,它的亮点是流式的JSON解析器及生成器。它是专为Java设计的,同时也能处理其它非JSON的编码。从我们在Github中的统计来看,它应该是最流行的JSON解析器。
  • Oracle的JSONP(https://jsonp.java.net/)。JSONP (JSON Processing)是JSON处理的一套Java API,从名字来看它就是用来生成及解析JSON串的。这是JSR353规范的一个开源实现。

基准测试

我们同时使用大文件和小文件对这些库进行了基准测试。随着文件大小的不同,处理这些文本所需要的系统资源也会随之上升。

这个基准测试主要关注两个关键场景:大文件下(190MB)的解析速度与小文件(1KB)下的解析速度。大文件取自这里:https://github.com/zeMirco/sf-city-lots-json。小文件是从这里随机生成的:http://www.json-generator.com/

不管是大文件还是小文件,我们都会用同一个库重复运行10次。对于每一个大文件,我们都会用同一个库来分别运行10次。而对于小文件,在单个库的单次运行中会重复执行10000次。在小文件测试的各次迭代中,文件内容都不会驻留在内存里,测试所运行的机器是AWS的c3.large实例。

大文件的完整测试结果如下,我对小文件的结果求了个平均值。想要看完整的结果,请移步这里。如果想看小文件测试的源码,请从这里下载。

大文件结果

结果相差甚大!Jackson与JSON.simple领跑了这轮测试,整体来看Jackson又要略优于JSON.simple。从测试运行的平均结果来看,Jackson与JSON.simple在大文件上的表现要优秀一些,而JSONP排名第三落后甚远,GSON更是遥遥垫底。

我们再把结果换算成百分比看下。平均来看Jackson要胜出一筹。下面是结果的百分比数据,可以从两个维度来进行比较:

不同库之间的性能差别着实不小。

结论:Jackson以略微优势胜出。JSON.simple紧随其后,而剩下两个库则远远落后。

小文件结果

上表记录的是对每个文件解析10次的平均时间,总的平均时间见下方。各个库在小文件测试中夺冠的次数如下:

  • GSON - 14
  • JSONP - 5
  • Jackson -1
  • JSON.simple - 0

这个结果貌似很有说服力。然而,从所有文件的平均结果来看,GSON这个冠军还是当之无愧的,JSON.simple和JSONP的二三名之争应该没什么悬念。Jackson这轮却是垫底了。尽管JSON.simple没有在任何文件上夺得第一,但总体来看它的解析速度却是排名第二位的。而JSONP尽管在许多文件上都拿到了冠军,但平均来看却只拿到了第三名的成绩。

还有一个值得注意的是,尽管Jackson是这轮最慢的库,但是它在所有文件中的表现都非常一致,其它三个库虽然偶然会比Jackson快很多,但在另一些文件上的解析速度却是旗鼓相当甚至更差。

我们再把这些数字转换成百分比看看,还是同样的两个维度:

和大文件测试相比,这次的差距相对要小一些,但也还是不容忽视的。

结论:很不幸的是,JSON.simple又以微弱的劣势与冠军失之交臂,这轮GSON胜。JSONP仍是千年老三而这回Jackson则赶了个晚集。

总结

解析速度并非衡量一个JSON库的唯一指标,但它的确非常重要。通过运行这次基准测试,我们发现没有一个库能在所有文件上击败对手。大文件中表现优秀的却在小文件上栽了根头,反之亦然。

如果要从解析速度来看选择哪个库的话还得取决于你的使用场景。

  • 如果你的应用经常会处理大的JSON文件,那么Jackson应该是你的菜。GSON在大文件上表现得相当吃力。
  • 如果你主要是处理小文件请求,比如某个微服务或者分布式架构的初始化,那么GSON当是首选。Jackson在小文件上的表现则不如人意。
  • 如果这两种文件你都经常会处理到,那么在两轮表现中都位居第二的JSON.simple对此类场景则更为适合。在不同的文件大小上Jackson和GSON的表现都不太好。

除非不考虑解析速度,不然JSONP完全没有什么值得称道的。它在大文件和小文件上的表现与其它库相比都很糟糕。所幸的是,Java 9很快便会有原生的JSON实现了,相信JSONP将来的表现仍然值得期待。

终于讲完了。如果你对JSON库的解析速度比较敏感的话,大文件选Jackson,小文件选GSON,两者则JSON.simple。如果你对这次的基准测试有什么疑问请在下方留言。

原文发布时间为:2013-04-02.

时间: 2024-12-03 12:21:50

Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP的相关文章

java中JSON库JSON.simple/GSON/Jackson/JSONP性能对比

JSON因为其易于人阅读和编写,同时也易于机器解析和生成,兼容性强,已经成为当前服务器与WEB应用之间数据传输的公认标准.本文我们在java编程语言运行了一个基准测试来对常用的几个JSON库进行了测试,看看在解析不同大小的文件时库的速度是最快性能最好的是哪个库. JSON通常用于传输及解析大文件.这对运行在Hadoop或者是Spark集群上的数据处理程序而言是个很常见的场景.在给定的文件大小下,你可以看到不同库之间的解析速度存在着明显的差别. 高吞吐量的情况下,会频繁地传输并解析小文件,因此一开

ava json-用java的谷歌库gson解析JSON,如下的json数据,该如何定义java类??

问题描述 用java的谷歌库gson解析JSON,如下的json数据,该如何定义java类?? 求高人指点,用java的谷歌库gson解析JSON,如下的json数据,该如何定义java类?? 在线等............... { "00:00:8e:d7:ba:ac:88:47": { "flow-mod-3": { "version": 1, "type": "FLOW_MOD", "le

[C#技术] .NET平台开源JSON库LitJSON的使用方法

原文:[C#技术] .NET平台开源JSON库LitJSON的使用方法 一个简单示例: String str = "{'name':'cyf','id':10,'items':[{'itemid':1001,'itemname':'hello'},{'itemid':1002,'itemname':'hello2'}]}";               //*** 读取JSON字符串中的数据 *******************************             Jso

谁给推荐一个C++的JSON库

问题描述 现在的一个项目,有JAVA的系统,有C++的服务器端,java端和C++服务器通信使用JSON格式,之前用了一个C的库,叫cJSON,但是出于以下原因,想换一个,最好是C++的库.1. 尽量减少代码量,希望可以像操作map.list一样能够很容易的操作JSON对象.2. 能够有可能使用内存池.由于C++端与java端需要比较频繁的交互,数据都是JSON格式的,就会频繁的创建.销毁对象.虽然说目前性能没什么问题,但是,还是想看看能否使用内存池.3. 由于现在用的C的库,都是指针操作,当对

【原创】具有path autovivification和conversion功能的JSON库

      研究该 JSON 库的由头是因为目前开发 modb 需要支持 json 解析功能.而发现这个有意思的 项目 的地方正是在开源中国.OSChina 对该库的描述如下:  json.c 是一个小型的 C 语言的 JSON 解析库,支持路径表达式.autovivification, 和 restartable I/O. 而库的作者做了更为丰富的表述(中英对照翻译如下):  ===== json.c is a JSON C library that supports path autoviv

java 数据交互 json-java数据交互,json传值

问题描述 java数据交互,json传值 传json格式的数据到后台,为什么接受不到,数据都是空的,打断点居然蹦不到后台,浏览器的开发者工具提示404错误,找不到路径,但是路径又是对的 解决方案 说明根本没有调用你的服务器端,如果你用的struts等框架,检查下url映射的配置. 解决方案二: 到不了后台说明你的请求路径配置错误,404就是你的请求根本找不到对应的资源.检查下配置吧. 解决方案三: 你的路径应该是有错的,或者路径配置有问题,并没有进入对应的servlet或者action 解决方案

Json字符串转换为java对象的各种实现方法【json_lib框架、Gson、org.json】

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://mengzhengbin520.blog.51cto.com/7590564/1283361 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - Decembe

java-extjs 树的问题,加载不出来,后台是用Java到数据读取的数据转换成json格式

问题描述 extjs 树的问题,加载不出来,后台是用Java到数据读取的数据转换成json格式 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@include file="common/common.jsp"%> <% pagemenustr += "addBtn(tb,'" + I18n.getText(&

我的Android进阶之旅------&amp;gt;解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题

1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: [ { id: "NEW2016062800875700", from: "腾讯新闻客户端", qqnews_download_url: "http://inews.qq.com/m?refer=openapi_for_xiaotiancai",