`
hjg1988
  • 浏览: 69028 次
  • 性别: Icon_minigender_1
  • 来自: 浙江
社区版块
存档分类
最新评论

json工具性能比较:json-lib和jackson进行Java对象到json字符串序列化

阅读更多
    网上查找“java json”,发现大家使用最多的还是json-lib来进行java对象的序列化成json对象和反序列化成java对象的操作。但是之前在网上也看到过一往篇关于json序列化性能比较的文章,不过一下子找不到了,所以没有引用。另外公司同事也做过类似的测试,结果都表明,json-lib的性能不太令人满意,而一个叫jackson的json序列化工具却表现不俗,另外,json-lib对null值的处理让人也感觉比较困惑。
    这里,我也对这两个java json工具进行了一次粗略的测试,主要测试从java对象序列化成json字符串的性能。按以下三种方式进行:
  1. 使用jackson,并在每次循环中重用ObjectMapper对象(jackson with cache)
  2. 使用jackson,并在每次循环中重新生成ObjectMapper对象(jackson without cache)
  3. 使用json-lib
  4. 直接使用StringBuffer进行字符串拼接

    因为见过有人在使用jackson时,每次都new 一个ObjectMapper的情况,而在官方教程中看到过这样一段话(can reuse, share globally)http://jackson.codehaus.org/Tutorial
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally
User user = mapper.readValue(new File("user.json"), User.class);

即ObjectMapper可以重用,所以这里同时进行重用和不重用方式的测试,另外还测试直接使用StringBuffer拼接字符串的方式,以比较json序列化与原始的java方法的性能差异。
    这里以不断增加并发线程数,每个线程循环进行1000次序列化,每次进行100次测量,结果取一个线程跑完(即序列化完1000次)的时间平均值的方式测试在多线程并发情况下的性能。
    测量次数 = 100
    每个线程循环进行序列化次数 = 1000
    平均时间为一个线程跑完时间 = 总时间/测量次数/线程数

    测试的java对象包含了基本类型属性和复杂属性,并且对象具有继承关系




    注:内存使用情况的数据据仅供参考,这个结果并不准确,因为受机器影响比较大,每次测试差异也比较大,不能准确说明问题,但还是可以参考一下。
    从上面的两个时间性能的图中可以看出,无论是在低并发还是高并发的情况下,时间性能上,jackson使用重用ObjectMapper方式大大优于使用json-lib方式,甚于jackson使用非重用ObjectMapper方式也略优于json-lib方式。另外也可以看出,jackson在重用ObjectMapper的方式下,性能几乎接近于直接使用StringBuffer的append方法拼接了,尤其在高并发的情况下,两者的曲线几乎要重合了。从这里可以看出jackson的性能非常出色。
    另外,从两个空间性能的图中得出的结论与时间性能基本相同,但是由于内存的使用量波动较大,每次测量的结果也相差比较大,并不十分准确,但还是可以看出个大概。
    此外,还发现一个现象,在低线程数的情况下,只开一个线程的时间性能要比同时开多个线程的时间性能差不少,具体原因还有待分析,不知道是否与双核CPU有关。

    另外附上测试代码json-test.rar,其中使用了一个同事写的测试工具,叫nanobench.jar的jar包(这个工具会在每次测试前每做一次“预热”,以排除干扰,因为java虚拟机刚开始运行时会比较慢。并在测试前会做机器资源清理工作,以减小每次测试受上次测试的影响,参考源码:http://code.google.com/p/nanobench/source/checkout)。
  • 大小: 24.5 KB
  • 大小: 38.2 KB
  • 大小: 28.8 KB
  • 大小: 36.8 KB
分享到:
评论
11 楼 dennis_zane 2010-01-05  
一个更详细的benchmark,详细比较了各种序列化机制的性能

http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
10 楼 ubotutwin 2010-01-05  
<p>     请教lz,jackson有没有像json-lib一样的xml--json之间直接转换的功能?</p>
9 楼 x_root 2010-01-05  
json-lib与struts2带的json插件相比也要慢30%,性能确实一般。
xstream序列化也对javabean的规范支持不好,不是根据get方法来的,是根据属性来的。
8 楼 hjg1988 2010-01-05  
itstarting 写道
自己也做一下测试看,顺道关注下xstream的表现

下次有空去研究一下jackson的源代码。测试中我StringBuffer的方式是写死的直接把属性拼装起来的,连判断都没有,理论上性能应该是很高了,但jackson却能达到与它如此接近,应该说是非常强了
7 楼 itstarting 2010-01-05  
自己也做一下测试看,顺道关注下xstream的表现
6 楼 hjg1988 2010-01-04  
quaff 写道
dieslrae 写道
google的gson建议去测试一下

gson比jackson慢一个数量级,而且gson是对field序列化,不符合java bean惯例对getter序列化.

正如你所说,我刚刚粗略测试了一下,一个复杂对象序列化1000次,我用jackson花了6.5ms,而用gson花了65ms左右
5 楼 quaff 2010-01-04  
dieslrae 写道
google的gson建议去测试一下

gson比jackson慢一个数量级,而且gson是对field序列化,不符合java bean惯例对getter序列化.
4 楼 hjg1988 2010-01-04  
dieslrae 写道
google的gson建议去测试一下

gson据说不错,下一次有空会去测试一下,另外再详细测试一下反序列化的性能
3 楼 dieslrae 2010-01-04  
google的gson建议去测试一下
2 楼 hjg1988 2010-01-04  
newsky 写道
xstream和stringtree 测试过吗?

没有测试过,这两个性能如何?好用吗?
我主要是因为公司里面用到这两个,并且大部分在用json-lib,所以对这两个进行了测试
1 楼 newsky 2010-01-04  
xstream和stringtree 测试过吗?

相关推荐

    使用json-lib将java对象转换成json字符串

    JSON字符串到Java对象的转换通常通过反序列化实现,而Java对象到JSON字符串的转换则称为序列化。 - json-lib库提供了一套API,使得这种转换变得简单。例如,使用`net.sf.json.JSONObject.fromObject()`方法可以将...

    json-lib-2.4-jdk15.jar

    3. **JSON到Java对象的反序列化**:反之,它也提供了将JSON字符串转化为Java对象的功能,例如`JSONObject.toBean()`和`JSONArray.toList()`方法,能够将JSON数据映射到Java对象或列表。 4. **XML和JSON之间的转换**...

    java对象转换为json字符串或字符串数组

    总结,Java对象转换为JSON字符串或字符串数组是通过引入JSON库,如`json-lib`,然后利用其提供的序列化和反序列化方法实现的。了解并熟练掌握这些方法对于进行Java和JSON之间的数据交换至关重要。在实际项目中,根据...

    json-lib-2.2.3-jdk15.jar

    3. 序列化和反序列化:通过`fromObject()`和`toObject()`方法将Java对象序列化为JSON字符串,或从JSON字符串反序列化回Java对象。 4. 处理复杂结构:对于包含嵌套对象和数组的复杂结构,JSON-lib也能轻松应对,只需...

    json-lib-2.4和相应的依赖包

    1. **JSON到Java对象转换**:通过JsonNode、JSONArray和JSONObject等类,json-lib可以解析JSON字符串并生成对应的Java对象。例如,一个JSON对象可以被映射为一个HashMap,而一个JSON数组则可以转换为ArrayList。 2....

    json-lib 2.4 的 jar 包

    - 序列化:将Java对象转换为JSON字符串。例如,一个User类的对象可以通过json-lib转化为JSON格式,便于在网络中传输或存储。 - 反序列化:将JSON字符串还原为Java对象。接收到JSON数据后,可以将其解析成对应的...

    json-lib-2.2.2-jdk15.jar

    1. **JSON序列化与反序列化**:json-lib允许将Java对象转换为JSON字符串,反之亦然。例如,你可以将一个Java的HashMap转换成JSON格式,便于在网络上传输,或者将接收到的JSON字符串解析成Java对象,便于进一步处理。...

    json-lib-2.4 jar 程序文件

    这个jar包包含了一系列类和方法,允许开发者方便地将Java对象序列化为JSON字符串,或者从JSON字符串反序列化为Java对象。 在使用`json-lib-2.4 jar`之前,需要将其添加到项目的类路径中。这通常通过在构建工具(如...

    json-lib jar和所有依赖的jar

    2. 将JSON字符串反序列化回对应的Java对象。 3. 提供了多种数据类型转换的API,支持不同数据结构间的转换。 4. 支持XML与JSON之间的转换,方便跨平台数据交互。 5. 兼容多种版本的Java,包括Java SE和Java EE环境。 ...

    json-lib-2.3-jdk15开发包和所有依赖包

    `json-lib`是一个Java库,它提供了将Java对象转换为JSON格式,以及从JSON字符串反序列化回Java对象的功能。`json-lib-2.3-jdk15`是这个库的一个特定版本,兼容JDK 1.5,这意味着它可以在运行JDK 1.5或更高版本的Java...

    Java四大json库gson+fastjson+jackson+json-lib

    Gson是Google提供的一个开源库,它能够将Java对象转换为JSON字符串,同时也能够将JSON数据转换回等效的Java对象。Gson的优点在于其简单易用的API和强大的功能,支持自定义序列化和反序列化的策略。它对于复杂类型的...

    json-lib-2.4-jdk15.jar及其相关依赖

    3. **反序列化**: 同样,`json-lib`也提供了反序列化功能,可以将JSON字符串转换回Java对象。例如: ```java String jsonString = "{\"name\":\"张三\",\"age\":30}"; Person person = (Person) JSONObject.toBean...

    json-lib-2.4-jdk15源码和jar包

    JSON库如`json-lib`则提供了将Java对象转换为JSON格式和从JSON字符串反序列化为Java对象的功能,极大地简化了开发人员的工作。 `json-lib`是一个流行的Java库,用于处理JSON数据。在`json-lib-2.4-jdk15`这个版本中...

    json-lib包(Java解析JSON的所有依赖包)

    总结来说,`json-lib`是Java开发者处理JSON数据的一个强大工具,提供了一整套解决方案,从JSON字符串的解析到Java对象的转换,以及与其他数据格式的交互。这个资源包包含所有必要的依赖,使得开发者能快速集成和使用...

    json-lib-2.2.3-jdk15

    5. **序列化与反序列化**:`JSONObject.fromObject()`和`JSONObject.toObject()`可以实现Java对象到JSON字符串的序列化,以及JSON字符串到Java对象的反序列化。 6. **处理日期和时间**:由于JSON标准不包含日期类型...

    json-lib-jdk.jar

    1. **对象转换**:可以将Java对象(如ArrayList、HashMap等)直接转换为JSON字符串,也可以将JSON字符串反序列化回Java对象。 2. **XML与JSON转换**:它还支持XML和JSON之间的转换,这在需要在两种格式间切换的场景...

    json-lib-2.23

    1. **序列化**:将Java对象转换为JSON字符串。例如,一个Java对象可以是一个简单的JavaBean,也可以是List、Map或者其他复杂的数据结构。`json-lib`提供了多种方法,如`net.sf.json.JSONObject.fromObject(Object ...

    json-lib-2.4(2013.6.13前最新版本)选定版

    1. **JSON对象和数组的解析与生成**:`json-lib`提供了一系列API,可以将JSON字符串解析成Java对象,如JSONObject和JSONArray,同时也能将Java对象转换成对应的JSON字符串。 2. **数据类型转换**:`json-lib`支持将...

    json-lib-2.4-jdk15及其依赖jar包

    4. **序列化和反序列化**:用户可以通过`json-lib`将Java对象序列化为JSON字符串,然后在需要的时候反序列化回原来的Java对象。 5. **XML和JSON互转**:`json-lib`还提供了XML到JSON以及JSON到XML的转换功能,使得...

Global site tag (gtag.js) - Google Analytics