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

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

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

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

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。如果你对这次的基准测试有什么疑问请在下方留言。

原文地址http://www.bieryun.com/1757.html

Java中哪个JSON库的解析速度是最快的?的更多相关文章

  1. Java 下的 JSON库性能比较:JSON.simple

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  2. Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP

    JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...

  3. JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson

    java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...

  4. 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据

    百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...

  5. JAVA中使用JSON进行数据传递

    最近在做一个基于JAVA Servlet的WEB应用以及对应的Anroid应用客户端的开发工作. 其中,在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JS ...

  6. 转载:JAVA中使用JSON进行数据传递

    转载网址:http://www.cnblogs.com/undead/archive/2012/07/18/2594900.html 最近在做一个基于JAVA Servlet的WEB应用以及对应的An ...

  7. 3、示例(在java中使用JSON)

    教程链接(json-smple1.1.1.jar文件) 链接:http://pan.baidu.com/s/1qXPbYHm 密码:v0f0 如何使用java编程语言编码和解码JSON 首先准备环境以 ...

  8. Java 中的JSON 字符串

    类库选择 Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库. 下面是几个常用的 JSON 解析类库: Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿 ...

  9. Java中的Json序列化,不容忽视的getter

    在开发的过程中,经常会碰到和自己预期不一样的情况.有的时候自己去研究一下还是很有趣的.这两天在写java web的时候,碰到了一个对象序列化的问题. 问题重现 public class AjaxJso ...

随机推荐

  1. CSS:CSS Positioning(定位)

    ylbtech-CSS:CSS Positioning(定位) 1.返回顶部 1. CSS Positioning(定位) position 属性指定了元素的定位类型. position 属性的四个值 ...

  2. docker 镜像中心搭建

    1.由于国外镜像很慢,所以用了网易蜂巢的镜像docker pull hub.c.163.com/library/registry:2.5.2本地的存储空间挂载到容器内部,持久保存镜像中心文件docke ...

  3. Elasticsearch介绍和安装与使用

    转载:https://blog.csdn.net/weixin_42633131/article/details/82902812 1.Elasticsearch介绍和安装 1.1.简介1.1.1.E ...

  4. 调试Bochs在Linux Mint下面symbol not found的问题

    在我的Linux Mint上使用Bochs时出现了很奇怪的问题,按照http://www.cnblogs.com/long123king/p/3568575.html步骤 会提示: symbol no ...

  5. 洛谷 P4173 残缺的字符串 (FFT)

    题目链接:P4173 残缺的字符串 题意 给定长度为 \(m\) 的模式串和长度为 \(n\) 的目标串,两个串都带有通配符,求所有匹配的位置. 思路 FFT 带有通配符的字符串匹配问题. 设模式串为 ...

  6. C# 简单的往txt中写日志,调试时很有用

    原文 http://blog.csdn.net/hejialin666/article/details/6106648 有些程序在调试时很难抓住断点(如服务程序),有些程序需要循环无数次,要看每一次或 ...

  7. 记一次批量修改SQLServer表数据

    前提: 1.数据有上百万条,分成10几张excel表,从数据库中导出,由业务部门修改: 2.数据没什么规律: 3.和数据库DB商量后决定先把从excel导进数据库中,再通过关联查询修改数据 将 Exc ...

  8. 第十一篇 session和cookie自动登录机制

    session和cookie的作用和区别可以在网上查到,这里简单说下,我们使用的http协议本身是种无状态的协议,就是说web服务器接收到浏览器的请求,会直接返回相应内容,并不会检查是哪个浏览器,即浏 ...

  9. GetModuleHandleW 分析

    首先查询MSDN,可以清楚地看到 位于kernel32 dll 里面. 有目标就好办,找到这个dll,然后,开工,进入IDA. 跳啊 就到下面那块了. 遗憾的是...显然不是这里阿,实际上下一块调用的 ...

  10. js中的数据类型隐式转换的三种情况

    js的数据类型隐式转换主要分为三种情况: 1. 转换为boolean类型 2. 转换为number类型 3. 转换为string类型 转换为boolean类型 数据在 逻辑判断 和 逻辑运算 之中会隐 ...