Java中哪个JSON库的解析速度是最快的?
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库的解析速度是最快的?的更多相关文章
- Java 下的 JSON库性能比较:JSON.simple
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...
- Json学习总结(2)——Java 下的 JSON库性能比较:JSON.simple vs. GSON vs. Jackson vs. JSONP
JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考了.我们很少会去想用到的这些JSON库到底有什么不同,但事实上它 ...
- JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson
java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...
- 在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据
百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路 ...
- JAVA中使用JSON进行数据传递
最近在做一个基于JAVA Servlet的WEB应用以及对应的Anroid应用客户端的开发工作. 其中,在接口的访问和数据的传输方面使用的比较多的是使用JSON对象来操作格式化数据:在服务器端采用JS ...
- 转载:JAVA中使用JSON进行数据传递
转载网址:http://www.cnblogs.com/undead/archive/2012/07/18/2594900.html 最近在做一个基于JAVA Servlet的WEB应用以及对应的An ...
- 3、示例(在java中使用JSON)
教程链接(json-smple1.1.1.jar文件) 链接:http://pan.baidu.com/s/1qXPbYHm 密码:v0f0 如何使用java编程语言编码和解码JSON 首先准备环境以 ...
- Java 中的JSON 字符串
类库选择 Java中并没有内置JSON的解析,因此使用JSON需要借助第三方类库. 下面是几个常用的 JSON 解析类库: Gson: 谷歌开发的 JSON 库,功能十分全面. FastJson: 阿 ...
- Java中的Json序列化,不容忽视的getter
在开发的过程中,经常会碰到和自己预期不一样的情况.有的时候自己去研究一下还是很有趣的.这两天在写java web的时候,碰到了一个对象序列化的问题. 问题重现 public class AjaxJso ...
随机推荐
- Bootstrap-table 使用总结 转载https://www.cnblogs.com/laowangc/p/8875526.html
一.什么是Bootstrap-table? 在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这 ...
- 网页压缩--gzip和deflate的区别
我们在配置网站GZip压缩的时候,会发现有两个模块可以设置的,一个是GZip模块的参数配置,另一个是Deflate模块的参数配置,他们的设置方法是一样的.刚开始时我不太明白,这两地方有什么不同?网站开 ...
- There was an unexpected error (type=Method Not Allowed, status=405). Request method 'POST' not supported
背景:点击提交按钮ajax请求接口时,报出错误[ Whitelabel Error Page This application has no explicit mapping for /error, ...
- python全栈开放实践第三版第一章的练习题完成情况
练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道哪些语言属于编译型,哪些数以解释型.1 编译型:只须编译一次就可以把源代码编译成机器语言,后面的执行无须重新编译,直接使用之前的编译结果就可 ...
- <软件测试>软件测试
1.软件测试基础 软件测试工程师:查找错误和缺陷,然后要求开发人员进行修改,保证软件质量. 漏洞(360安全漏洞):硬件,软件,协议的具体实现或系统安全策略存在缺陷,从而可以使攻击者在未授权的情况下破 ...
- nginx打包成rpm
[root@localhost ~ ]#yum -y install lrzsz pcre pcre-devel zlib zlib-devel vim nrt-tools psmisc gcc gc ...
- Linux/CentOS 7 timezone 修改
1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...
- 按钮与js事件先后顺序
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Maven pom配置(Spring+SpringMvc+mybaties)
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...
- 使用babel转码器,让浏览器支持es6语法
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,可是很多浏览器并不支持es6语法,所以我们需要一个转码工具, 把es6的语法转换成浏览器支持的javascr ...