杰克逊 vs Gson

401

在搜索了一些现有的JSON库后,我最终选择了以下两个:

  • Jackson
  • Google GSon

我稍微倾向于使用GSON,但网络上的传言是GSon存在一个名为“天体性能问题”的 问题(截至2009年9月)。

我正在进行比较,并在此期间,我正在寻求帮助来做出决定。


3
对于Android使用,我看到的最新性能基准是这个:http://www.martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/。 - StaxMan
1
最新的CowTalk性能基准测试。- 2011年1月8日 - Iogui
8
一则提示:选择使用GSon的人应该确保使用2.1版本 -- 其性能终于比早期版本有了显著提高。 - StaxMan
66
截至目前为止,这个问题已经获得了74个赞同,显然有一些有价值的答案。好的回答胜过“无建设性”的问题。投票重新开放。 - Nicholas
1
杰克逊的文档现在变得非常复杂了... - dongshengcn
显示剩余5条评论
5个回答

133

上周我做了这项研究,最终得出了相同的两个库。由于我正在使用Spring 3(它在其默认Json视图中采用了Jackson的'JacksonJsonView'),因此对我来说更自然的选择是使用同样的库。这两个库基本相同... 最终它们只是映射到一个json文件!:)

无论如何,就像你所说的那样,Jackson在性能方面优于其他库,这对我来说非常重要。从他们的网页可以看出,该项目也相当活跃,这也是一个很好的迹象。


2
此外,Google GSon尚不支持循环引用。那么Jackson能够处理它们吗? - Guido
1
循环引用的支持...应该是一个主要特性,但我不确定它是否支持它们,到目前为止我从未遇到过循环引用(即使它们应该相当普遍,尤其是在模型中)。这里有另一个基准测试,可以突出杰克逊相对于GSon的速度优势。在序列化/反序列化方面,它看起来快了100倍。http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking - mickthompson
1
Jackson 目前不处理循环引用。如果这很重要,XStream 可以处理;不确定是否有任何本地的 JSON 包可以处理(也许是 flex-json?) - StaxMan
13
从版本1.6开始,Jackson支持循环引用。请参阅使用声明性方法处理双向引用了解详情。 - Ophir Radnitz
根据Fortify的说法,Jackson存在更多的安全问题。 - TuGordoBello
还需要注意的是,Jackson使用可以捕获的异常,而Gson则不是。如果你在使用Jackson,你应该在你的代码中处理这些异常。无论好坏... - Tamir Adler

88
Jackson和Gson是目前在Java JSON数据绑定方面最完整的包;许多其他包只提供原始的Map/List或等效树模型绑定。 两者都对泛型类型有完整的支持,并具有足够的可配置性,适用于许多常见用例。
由于我更熟悉Jackson,在下面几个方面,我认为Jackson比Gson具有更完整的支持(如果我错过了Gson的某些功能,请谅解):
- 广泛的注释支持,包括完整的继承和高级的“混合”注释(将注释与类关联,以处理无法直接添加它们的情况) - 流式(增量)读取、写入,适用于超高性能(或内存受限)用例;可以与数据绑定(绑定子树)混合使用 -- EDIT:最新版本的Gson也包括流式读取器 - 树模型(类似DOM访问);可以在各种模型之间转换(树<->Java对象<->流) - 可以使用任何构造函数(或静态工厂方法),而不仅仅是默认构造函数 - 字段和getter/setter访问(早期的gson版本只使用字段,这可能已经改变了) - 开箱即用的JAX-RS支持 - 互操作性:还可以使用JAXB注释,具有常见包(joda,ibatis,cglib),JVM语言(groovy,clojure,scala)的支持/解决方法 - 强制输出静态(声明)类型处理的能力 - 支持反序列化多态类型(Jackson 1.5)--可以正确地序列化和反序列化像List这样的东西(带有额外的类型信息) - 集成二进制内容的支持(将base64转换为JSON字符串并相反)

7
实际上,这篇帖子 - http://www.cowtowncoder.com/blog/archives/2010/11/entry_434.html - 总结了Jackson包中许多其他软件包中没有的功能。 - StaxMan
15
我认为不要求注释应该被视为GSON的一个特性,而不是其不足之处(你在上面至少列出了3次)。 - orbfish
9
无论是Jackson还是Gson都不需要使用注解。但在我看来,拥有注解作为一个选项是一个有价值的功能(特别是“混合注解”,它是一种额外的处理选项,允许关联外部配置)。 - StaxMan
3
Gson允许您注册InstanceCreator,以指定替代的实例构造方式,而不是使用默认构造函数。 - inder

42

Gson 1.6现在包含了一种低级别的流API和一个新的解析器,实际上比Jackson更快。


我很想看到支持这一说法的数据。至少在http://wiki.fasterxml.com/JacksonInFiveMinutes上的测量结果仍然表明,GSON在与其他Java json包的竞争中处于劣势。 - StaxMan
2
我们有微基准测试可用(已检入Gson子版本库的trunk/metrics目录下),显示在简单对象转换上,低级流API可能快10倍。还有其他基准测试(我需要鼓励原作者发布),这个低级API目前击败了其他库,包括Jackson。然而,创建全面和代表性的基准测试需要一些时间和精力。 - inder
4
再提供一组数据:jvm-serializers(https://github.com/eishay/jvm-serializers)现在有一个“gson/manual”测试,它使用GSON流API作为数据绑定的替代方法。一旦作者运行了“官方”的数字,维基就可以更新了。但是从本地运行这个测试来看,我认为它并不支持声称自己非常快的说法。 - StaxMan
14
(附加说明:官方数字已包括在内——流式Gson比数据绑定更快,但不及Jackson的性能水平) - StaxMan
11
针对后续跟进的人,Gson 2.1 最终确实带来了明显且可衡量的性能改进。 - StaxMan

14

Jackson中用于支持大小写敏感的代码片段无法正常工作。或者说,它只适用于顶级属性。尝试嵌套一个属性,你会发现你的解决方案不起作用。 - Andres F.
2
实际上,Jackson 2.5版本中已经添加了对不区分大小写属性的正式支持,即MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES。因此,无需添加自定义代码来实现该功能。 - StaxMan

7

看起来GSon不支持JAXB。 通过使用JAXB注释的类创建或处理JSON消息,我可以使用Spring MVC共享同一类来创建Restful Web服务接口。


如果您的数据类已经有了Hibernate的注释,那么您也不需要为JAXB添加另一组注释。 - orbfish
1
能够添加对“外部”注释的支持是非常好的。Jackson有可选的JAXB注释模块,以及Hibernate模块用于其一些注释(用于瞬态、延迟加载)。也许Gson也可以扩展以允许模块化扩展。 - StaxMan
2
特别是JAXB是一个标准! - maxxyme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接