【问题标题】:Jackson Vs. Gson [closed]杰克逊VS。格森[关闭]
【发布时间】:2011-01-23 14:50:58
【问题描述】:

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

  • 杰克逊
  • 谷歌 GSon

我对 GSON 有点偏,但网上的消息是,GSON 受到某种天体性能的影响issue(截至 2009 年 9 月)。

我继续比较;与此同时,我正在寻求帮助来下定决心。

【问题讨论】:

  • 另外,对于 Android 使用,我看到的最新性能基准是这样的:martinadamek.com/2011/02/04/…
  • Latest CowTalk performnce benchmark. - 2011 年 1 月 8 日
  • 一个简短的说明:任何选择 GSon 的人都应该确保使用 2.1 -- 它的性能最终明显优于早期版本。
  • 截至目前已有 74 票赞成,这个问题显然有一些有价值的答案。好的答案胜过“非建设性”的问题。投票重新开放。
  • Jackson 的文档现在变得异常复杂。 . .

标签: java json comparison gson jackson


【解决方案1】:

我上周进行了这项研究,最终得到了相同的 2 个库。由于我使用的是 Spring 3(在其默认的 Json 视图中采用 Jackson 'JacksonJsonView'),所以我这样做更自然。 2个库几乎相同......最后它们只是映射到一个json文件! :)

正如你所说,杰克逊的表现是+,这对我来说非常重要。从their web page 可以看出,该项目也非常活跃,这也是一个非常好的迹象。

【讨论】:

  • 另外,Google GSon 还不支持循环引用。杰克逊会处理它们吗?
  • 循环引用支持...这应该是主要功能,但我不确定它是否支持它们,到目前为止我从未遇到过循环引用(即使它们应该很常见我认为,尤其是在模型中)。这是另一个可以突出杰克逊与 GSon 相比有多快的基准。它在序列化/反序列化中看起来快 100 倍 code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
  • Jackson 目前不处理循环引用。如果这很重要,XStream 可以;不确定是否有任何原生 json 包(也许是 flex-json?)
  • 从 1.6 版开始,Jackson 支持循环引用。参考Handle bi-directional references using declarative methods
  • 杰克逊有更多的安全问题,根据加固
【解决方案2】:

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

由于我对 Jackson 比较熟悉,以下是我认为 Jackson 比 Gson 支持更全面的一些方面(如果我错过了 Gson 功能,请见谅):

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

【讨论】:

  • 其实这篇文章 -- cowtowncoder.com/blog/archives/2010/11/entry_434.html -- 总结了 Jackson 的许多其他包中没有的特性。
  • 我认为不需要注释是 GSON 的一项功能,而不是缺陷(您在上面至少列出了 3 次)。
  • Jackson 和 Gson 都不需要使用注释。但是在我看来,将注释作为一个选项是一个有价值的特性(尤其是“混合注释”,它是允许关联外部配置的附加处理选项)。
  • Gson 允许您注册一个 InstanceCreator 以指定另一种构造实例的方法,而不是使用默认构造函数。
【解决方案3】:

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

【讨论】:

  • 我有兴趣看到支持这一点的测量。至少在:wiki.fasterxml.com/JacksonInFiveMinutes 的测量结果仍然表明 GSON 与其他 Java json 包没有竞争力。
  • 我们有可用的微基准(检查到 trunk/metrics 目录下的 Gson subversion 存储库),表明在简单的对象转换上,低级流 API 可以快 10 倍。还有其他基准(我需要鼓励原作者发布)这个低级 API 目前击败了包括 Jackson 在内的其他库。但是,创建全面且具有代表性的基准需要一些时间和精力。
  • 还有一个数据点:jvm-serializers (github.com/eishay/jvm-serializers) 现在有“gson/manual”测试,它使用 GSON 流 api 作为数据绑定的替代方案。一旦作者运行“官方”号码,wiki 就可以更新。但是从本地运行来看,我认为它不支持超快的说法。
  • (以上补充:官方数据包括在内——流式传输 Gson 比数据绑定更快,但达不到 Jackson 性能水平)
  • ...对于任何跟进的人来说,Gson 2.1 最终确实带来了显着且可衡量的性能改进。
【解决方案4】:

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

这里有两个相关链接

(否)Gson 支持区分大小写: GSON: How to get a case insensitive element from Json?

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

【讨论】:

  • Jackson 中用于区分大小写的 sn-p 不起作用。或者更确切地说,它只适用于顶级属性。尝试嵌套一个属性,你会发现你的解决方案不起作用。
  • 实际上在 Jackson 2.5 中添加了对不区分大小写属性 MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES 的正式支持。所以不需要为此添加自定义代码。
【解决方案5】:

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

【讨论】:

  • 如果您已经在 Hibernate 的数据类上添加了注解,那么无论如何您都不希望为 JAXB 设置另一个注解。
  • 很高兴能够添加对“外来”注释的支持。 Jackson 有可选的 JAXB 注释模块,以及用于其几个注释的 Hibernate 模块(用于瞬态、延迟加载)。也许 Gson 也可以扩展为允许模块化扩展。
  • 尤其是 JAXB 是一个标准!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2017-06-27
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多