杰克逊VS. GSON

Sur*_*ran 352 java comparison json jackson gson

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

  • 杰克逊
  • 谷歌GSon

我对GSON有点偏爱,但网上的消息是GSon遇到了某种天体性能问题(截至2009年9月).

我继续比较; 与此同时,我正在寻求帮助来决定我的想法.

mic*_*son 116

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

无论如何,正如你所说,杰克逊在表现上有+,这对我来说非常重要.你可以从他们的网页上看到这个项目非常活跃,这也是一个非常好的迹象.

  • 从版本1.6开始,杰克逊确实支持循环引用.请参阅[使用声明方法处理双向引用](http://wiki.fasterxml.com/JacksonFeatureBiDirReferences)以供参考. (11认同)
  • 此外,Google GSon尚未支持循环引用.杰克逊会处理它们吗? (2认同)

Sta*_*Man 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(带有其他类型信息)
  • 对二进制内容的集成支持(base64到/来自JSON字符串)

  • 我认为不要求注释是GSON的一个特征,而不是缺陷(你已经列出了至少3次以上). (11认同)
  • 实际上,这篇文章 - http://www.cowtowncoder.com/blog/archives/2010/11/entry_434.html--总结了许多其他软件包中没有的Jackson功能. (6认同)
  • Jackson和Gson都不需要使用注释.但是,在我看来,将注释作为选项是一个有价值的特性(特别是"混合注释",这是允许关联外部配置的附加处理选项). (5认同)
  • Gson允许您注册InstanceCreator以指定构造实例的替代方法,而不是使用默认构造函数. (2认同)

ind*_*der 37

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

  • (除上述之外:官方数字包括在内 - 流媒体Gson比数据绑定更快,但达不到杰克逊的表现水平) (12认同)
  • ...对于任何跟进的人来说,Gson 2.1最终确实提出了重要且可衡量的性能改进. (9认同)
  • 还有一个数据点:jvm-serializers(https://github.com/eishay/jvm-serializers)现在有"gson/manual"测试,它使用GSON流API作为数据绑定的替代.一旦作者运行"官方"号码,就可以更新维基.但是从本地运行这个,我不认为它支持超快的声明. (3认同)
  • 我们有可用的微基准测试(检查到 trunk/metrics 目录下的 Gson subversion 存储库),表明在简单的对象转换中,低级流 API 可以快 10 倍。还有其他基准测试(我需要鼓励原作者发布),这个低级 API 目前击败了包括 Jackson 在内的其他库。但是,创建全面且具有代表性的基准测试需要花费一些时间和精力。 (2认同)

sne*_*egi 12

添加上面已经给出的其他答案.如果案件不敏感对你很重要,那就用杰克逊.Gson不支持对键名称不区分大小写,而杰克逊则支持.

这是两个相关的链接

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

杰克逊的案例敏感性支持 https://gist.github.com/electrum/1260489

  • 实际上,Jackson 2.5 中添加了对不区分大小写属性的正式支持,`MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES`。因此无需为此添加自定义代码。 (2认同)

小智 6

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

  • 尤其是JAXB是一个标准! (2认同)