安卓JSON库的性能和可用性比较

32

有没有适用于Android的最佳JSON解析库?我知道Android框架内置了一个JSON库,也听说过GSON。但我想知道是否有人比较过Android上各种JSON选项,并给出了选择其中一种的理由。我认为性能和易用性是主要标准。


到目前为止,回复都很好。但我真的想听更多关于性能方面的内容。 - Kurtis Nusbaum
如果您考虑性能,那么您也应该考虑内存使用情况。我正在使用的Android JSON版本不支持从读取器/输入流进行标记,并且映射到数据模型将需要2倍的内存。 - ThomasRS
在我的“快得多得多”的链接中,有一个相当广泛的性能比较,包括序列化时间、反序列化时间和大小。除此之外,您还需要寻找其他内容吗? - kabuko
7个回答

40
虽然有一些Java-to/from-JSON API可以提供基本的JSON和任意Java数据结构之间的绑定,但Jackson和Gson是目前最复杂、功能最丰富的选项。
2011年7月,我在我的博客上发布了一个多部分系列文章,比较了使用Gson与Jackson,按照Gson用户指南中的组织方式逐步介绍其功能,包括在Jackson中进行可比实现的示例(以及在Gson中实现的示例,其中Gson用户指南不完整或损坏)。
该系列的第六部分提供了易于导航的比较链接,以及简要的比较列表。 http://programmerbruce.blogspot.com/2011/07/gson-v-jackson-part-6.html 这是到目前为止使用Gson与Jackson进行常见JSON-to/from-Java任务的最全面的比较。
如上所述,各种Java-to/from-JSON API的性能比较可以在https://github.com/eishay/jvm-serializers/wiki上找到。当前版本的Gson(2.0)在序列化和反序列化一个500字节的JSON结构时,使用非常相似的实现方法(只需一两行代码)比当前版本的Jackson(1.9.2)慢约16倍。
Martin Adamek在http://martinadamek.com/2011/01/31/comparison-of-json-parsers-performance-on-android/http://martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/上发布了各种API在Android上运行的性能结果。

2
不要忘记考虑库的大小。Gson大约为200kb,而Jackson的3个依赖项将占用约1mb。如果您不需要极高的性能,我建议使用Gson,因为它简单且库的大小适中。 - CorayThan

9

GSON非常简单易用,如果性能不是问题的话,它还是相当不错的。Jackson速度要快得多,而且使用起来并没有太大的难度。正如我在过去在另一个相关的SO问题中所说的那样,仅仅通过从GSON切换到Jackson,我就获得了巨大的性能提升(当处理大量JSON时)。


3
这个答案是从内存角度考虑的,因为这也可以被认为是性能:-P。
我刚刚在Android中实现了对70KB JSON文件的解析,解析一个对象数组,应该从头开始加载或更新先前存在的数据绑定对象,所有这些都通过HTTP完成。 内置的org.json包对于android runtime 3最大的缺点是:
  1. JSONTokener构造函数仅接受String,没有Reader
  2. 缺乏实用的pull-parsing支持
这通常意味着您需要将整个文件保留在内存中(考虑2倍的字节大小),并且在开始进行数据绑定之前同时将所有生成的JSON对象保留在内存中。所以最坏的情况是2倍的文件大小、JSON对象和数据绑定对象——通常至少需要2倍的内存要求。
如果您从Reader pull-parse,则可以将其降低到1x。这是您从内存角度考虑的最重要的事情。

惊喜的是,如果你选择一些更现代的类库,比如Jackson或者最新的org.json源码,你可以轻松避开这些限制。较新版本的Android运行时还提供了一些JSON pull-parsing的实用类。

如果你被困在旧版运行时环境中,并且想要保持应用程序的占用空间,就像我一样,你可以复制来自org.json的JSONTokener,并修改顶层解析循环(在我的情况下是数组解析循环),并对数组的每个成员进行数据绑定,而不是一次性地绑定整个数组。这样你尽可能地重用Android运行时中已有的JSON对象,仍然能够获得流式效果(以每个顶级对象添加ID为代价)。


我喜欢这个回答,因为它解释了为什么像分词法这样的方法更快。 - Kurtis Nusbaum
如果重要的延迟被测量为网络请求发起到响应处理完成的时间,那么流处理对于XML和JSON以及其他格式来说都是理想的。 - ThomasRS

3

有时性能和易用性可能会出现矛盾,但我发现相比于其他选项,如Jacksonorg.json等,使用GSON更加容易。我目前正在序列化包含3或4级对象和列表的JSON数据。话虽如此,我已经调整了我的JSON使其更适合于序列化,总体而言,GSON非常棒。


1

尝试使用android-async-http

  • 进行异步HTTP请求,并在匿名回调中处理响应
  • HTTP请求发生在UI线程之外
  • 使用线程池限制并发资源使用
  • GET/POST参数构建器(RequestParams)
  • 无需额外的第三方库即可进行多部分文件上传
  • 对您的应用程序的大小开销非常小,仅为25kb
  • 针对网络连接不稳定的智能请求重试自动优化
  • 自动gzip响应解码支持实现超快速的请求
  • 使用BinaryHttpResponseHandler进行二进制文件(图像等)下载
  • 内置的JsonHttpResponseHandler将响应解析为JSON
  • 持久化Cookie存储,将Cookie保存到您的应用程序的SharedPreferences中

您还可以尝试使用fastjson,这是一个快速的JSON处理器。


嗨,请阅读http://stackoverflow.com/questions/how-to-answer,特别是“**提供链接上下文**”部分。 - Eel Lee

1

Android JSON功能强大,但没有花哨的功能。而GSON允许您指定类和它们的JSON表示之间的映射。它还具有非常好的自动将任何原始值转换为JSON的功能,无需您额外的工作。

GSON的回报是如果您有大量的JSON通信或需要值检查以防止非法值(例如NaN)和其他情况,其中Java-to-JSON不太直接。

但是,如果您只需要发送和接收简单的JSON对象,则本机库可以相当可靠地完成任务。我正在我的当前项目中使用它来将高分数发布到服务器。


1

我正在测试GSON并尝试了一些其他的库。

GSON在序列化(将对象转换为JSON)复杂对象方面表现出色,基本上不需要你做任何更改或思考,但速度较慢且占用内存较多。

GSON Roadmap 网站指出他们期望版本2.0解决一些性能问题,并将于2011年10月发布(即将到来)。所以我希望他们能够交付,因为我真的需要它。

其他库(抱歉,现在无法回忆起名称)似乎没有很好地进行序列化。有些可能只查看类中的公共变量或调用看起来像getter/setter的公共方法。Gson不是这样做的,它会获取所有内容。

我还没有在反序列化方面(将JSON转换回Java对象)做过太多工作。


我正在比较购物gson库,并且很想知道gson 2.0+是否在性能方面有所改进。 - JimN
@JimN:是的,gson 2.0 似乎运行得更好。实际上,我认为甚至有比 2.0 更新的版本,但我没有尝试过。我正在很有效地使用它。需要注意的一件事是:在导出我的应用程序并进行测试后,由于 Proguard 和 GSON,我遇到了问题。 - Fraggle

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