杰克逊诉 格森[关闭]


363

在搜索了一些现有库的JSON之后,我最终得到了这两个:

  • 杰克逊
  • 谷歌GSon

我对GSON有点偏爱,但网上有消息说GSon受到某些天体性能问题的困扰(截至2009年9月)。

我正在继续我的比较;同时,我正在寻找帮助下定决心。


3
另外,Android的使用,我已经看到了最新的业绩比较基准是:martinadamek.com/2011/02/04/...
StaxMan


7
快速说明:选择GSon的任何人都应确保使用2.1-它的性能最终要比早期版本好得多。
StaxMan

46
截至目前,已经有74个投票,这个问题显然有一些有价值的答案。好的答案胜过“非建设性”的问题。投票重新开放。
尼古拉斯

1
杰克逊的文件现在变得异常复杂。。。
dongshengcn 2013年

Answers:


117

我上周做了这项研究,最后得到了相同的2个库。当我使用Spring 3(在默认的Json视图“ JacksonJsonView ” 中采用Jackson )时,对我来说更自然。2 lib几乎相同...最后,它们只是映射到json文件!:)

无论如何,正如您所说,杰克逊的表现为+,这对我来说非常重要。从他们的网页上可以看到,该项目也非常活跃,这也是一个很好的信号。


2
此外,Google GSon尚不支持循环引用。杰克逊会处理吗?
Guido'3

1
循环引用支持...应该是主要功能,但是我不确定它是否支持它们,到目前为止,我还从未遇到过循环引用(即使我认为它们应该很常见,尤其是在模型中) 。这是另一个基准,可以突出显示与GSon相比,杰克逊有多快。在序列化/反序列化code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking中,
mickthompson

1
Jackson目前不处理循环引用。如果那很重要,那么XStream会做到;不知道是否有任何本地json包(也许是flex-json?)
StaxMan 2010年

11
从1.6版开始,Jackson确实支持循环引用。请参阅使用声明性方法处理双向引用作为参考。
Ophir Radnitz

杰克逊有更多安全问题,需要加强
-TuGordoBello

83

Jackson和Gson是有关实际数据绑定支持的最完整的Java JSON软件包。许多其他软件包仅提供原始Map / List(或等效树模型)绑定。两者都完全支持通用类型,并且对于许多常见用例都具有足够的可配置性。

由于我对杰克逊比较熟悉,因此我认为杰克逊在某些方面比Gson更加全面(如果我错过了Gson功能,我们深表歉意):

  • 广泛的注释支持;包括完全继承和高级“混合”注释(对于无法直接添加它们的类,将注释与类相关联)
  • 流式(增量式)读取,写入,用于超高性能(或内存有限)的用例;可以与数据绑定(绑定子树)混合使用- 编辑:Gson的最新版本还包括流阅读器
  • 树模型(类似于DOM的访问);可以在各种模型之间进行转换(树<-> Java对象<->流)
  • 可以使用任何构造函数(或静态工厂方法),而不仅仅是默认构造函数
  • 字段和getter / setter访问(早期的gson版本仅使用字段,可能已更改)
  • 开箱即用的JAX-RS支持
  • 互操作性:还可以使用JAXB批注,对常用软件包(joda,ibatis,cglib),JVM语言(groovy,clojure,scala)具有支持/解决方法
  • 能够强制对输出进行静态(声明)类型处理
  • 支持反序列化多态类型(Jackson 1.5)-可以正确地序列化和反序列化诸如List之类的东西(带有其他类型信息)
  • 集成支持二进制内容(从/到JSON字符串的base64)

6
实际上,这篇文章(cowtowncoder.com/blog/archives/2010/11/entry_434.html)总结了许多其他软件包中未提供的Jackson功能。
StaxMan 2011年

12
我认为不要求注释是GSON的功能,而不是缺陷(您已在上面列出了至少3次)。
orbfish

6
杰克逊和格森都不要求使用注释。但是在我看来,将注释作为选项是一项有价值的功能(特别是“混合注释”,它是允许关联外部配置的附加处理选项)。
StaxMan 2013年

3
Gson允许您注册InstanceCreator来指定替代方法,而不是使用默认构造函数来构造实例。
2014年

37

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


我将有兴趣看到支持这一点的度量。至少在wiki.fasterxml.com/JacksonInFiveMinutes上进行的测量仍然表明GSON与其他Java json软件包没有竞争力。
StaxMan 2011年

1
我们有可用的微基准测试(已检入trunk / metrics目录下的Gson子目录存储库),这些基准显示在简单的对象转换中,低级流API的速度最高可以提高10倍。还有其他基准测试(我需要鼓励原始作者发布),该低级API目前超过了其他库,包括Jackson。但是,创建全面且具有代表性的基准将需要一些时间和精力。
2011年

3
另一个数据点:jvm-serializers(github.com/eishay/jvm-serializers)现在具有“ gson / manual”测试,该测试使用GSON流式API替代数据绑定。一旦作者使用“官方”号码,便可以更新Wiki。但是从本地运行它,我不认为它支持超快速的声明。
StaxMan 2011年

12
(除上述之外:包括官方数字-流Gson比数据绑定更快,但未达到Jackson的性能水平)
StaxMan 2012年

9
...对于任何跟进的人,Gson 2.1最终确实提出了重大且可衡量的性能改进。
StaxMan 2014年

13

添加到上面已经给出的其他答案。如果不区分大小写对您来说很重要,请使用Jackson。Gson不支持键名区分大小写,而jackson支持。

这是两个相关的链接

(否)Gson支持区分大小写: 区分大小写 GSON:如何从Json获得不区分大小写的元素?

Jackson中的区分大小写支持 https://gist.github.com/electrum/1260489


Jackson 中的区分大小写支持代码段无效。或者说,它仅适用于顶级属性。尝试嵌套一个属性,您将看到解决方案无效。
Andres F.

1
实际上MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES,Jackson 2.5中增加了对不区分大小写的属性的正式支持。因此,无需为此添加自定义代码。
StaxMan,2016年

6

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


如果您已经在Hibernate的数据类上添加了注释,那么您无论如何都不希望使用JAXB的其他集合。
orbfish

1
很高兴能够添加对“外国”注释的支持。Jackson具有可选的JAXB注释模块,以及用于其几个注释的Hibernate模块(用于瞬态,延迟加载)。也许可以将Gson扩展为允许模块化扩展。
StaxMan 2014年

2
特别是因为JAXB是标准!
maxxyme '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.