Android JSON库的性能和可用性比较

时间:2011-10-28 21:24:55

标签: java android json

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

7 个答案:

答案 0 :(得分:40)

虽然有一些Java-to-from-JSON API提供了JSON和任意Java数据结构之间的简单(基本)绑定,但Jackson和Gson是迄今为止最复杂(功能强大)且功能丰富的选项。

早在七月(2011年),我在我的博客上发布了一个多部分系列,比较使用Gson和Jackson,逐步介绍Gson用户指南中的功能,包括Jackson中可比较实现的示例(以及实现)在Gson,Gson用户指南不完整或破损。

本系列的第六部分提供了比较的简易导航链接,以及摘要比较列表。 http://programmerbruce.blogspot.com/2011/07/gson-v-jackson-part-6.html

这是使用Gson与Jackson进行常见的JSON-to / from-Java任务的最全面比较。

如上所述,https://github.com/eishay/jvm-serializers/wiki提供了各种Java-to / from-JSON API的性能比较。 Gson(2.0)的当前版本显示比当前版本的Jackson(1.9.2)在串行化和反序列化500字节JSON结构时要慢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/

上发布了在Android上运行的各种API的一些效果结果

答案 1 :(得分:9)

GSON使用起来非常简单,如果性能不是问题,那就非常好了。 Jackson虽然much, much fasterthe past,但实际上并没有那么多努力。正如我在{{3}}中在另一个相关的SO问题中所说的那样,通过简单地从GSON切换到Jackson,我获得了巨大的性能提升(当使用大量的JSON时)。

答案 2 :(得分:3)

有时候性能和可用性可能会有所不同,但我发现GSON比 Jackson org.json 和其他人。我目前正在序列化具有对象并列出3或4级深度的JSON数据。话虽如此,我已经将我的JSON定制为更适合序列化,但整体GSON一直很棒。

答案 3 :(得分:3)

从记忆的角度来看这个答案,因为这也可以被视为表现:-P。

我刚刚在Android中实现了对70KB JSON文件的解析,解析了一个对象数组,这些对象应该从头开始加载或者通过HTTP更新以前存在的数据绑定对象。

Android运行时3的built-in org.json package的最大缺点是

  1. JSONTokener构造函数只接受String,不接受Reader
  2. 缺乏对解析的实际支持
  3. 这通常意味着您需要将整个文件保留在内存中(比如2x字节大小),并且在开始进行数据绑定之前,还要同时在内存中保存所有生成的JSON对象。最糟糕的情况是2x文件大小,JSON对象和数据绑定对象 - 通常至少是内存要求的2倍。

    如果您从阅读器进行解析,则可以将其降低到1倍。从记忆的角度来看,这是你能做的最重要的事情。

    而且,令人惊讶的是,如果你选择一些更现代的类,比如杰克逊或org.json的最新资源,你将能够绕过这两个约束而没有问题,后来的android运行时似乎也似乎有一些JSON pull-parsing实用程序类。

    如果您遇到旧的运行时,并希望保持应用程序的占用空间,就像我一样,您可以从org.json复制JSONTokener并修改您的顶级解析循环(在我的情况下是数组解析) loop)并且一次对数组的每个成员而不是整个数组进行数据绑定。这样你就可以尽可能地重用已经在android运行时中的JSON对象,并且仍然可以获得流式效果(以向每个顶级对象添加id为代价)。

答案 4 :(得分:1)

Android JSON功能非常强大,但并没有让人觉得麻烦。 GSON允许您指定类与其json表示之间的映射。它还可以将任何原始值自动转换为json,而无需您进行额外的工作。

使用GSON的回报是,如果你有很多JSON社区,或者需要进行值检查以防止非法值(例如NaN)的复杂对象以及其他java-to-JSON不太直接的情况。

但是如果你只需要发送和接收一个简单的json对象,那么本机库可以很好地完成这个技巧。我在我当前的项目中使用它将高分发布到服务器。

答案 5 :(得分:1)

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

GSON在序列化(将对象转换为json)复杂对象方面做得非常出色,基本上没有任何改变或根本不考虑,但是有点慢和内存密集。

GSON Roadmap网站表示他们希望2.0版能够解决一些性能问题,并且它将在2011年10月(即将结束)发布。所以我希望他们提供这个,因为我真的需要它。

其他图书馆(抱歉现在不记得名字)似乎也没有序列化。有些人可能只查看类中的公共变量,或者只调用看起来像getter / setter的公共方法。 Gson没有这样做,并且会抓住一切。

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

答案 6 :(得分:1)

尝试android-async-http

  • 发出异步HTTP请求,处理匿名回调中的响应
  • HTTP请求发生在UI线程之外
  • 请求使用线程池来限制并发资源使用量
  • GET / POST参数构建器(RequestParams)
  • 多部分文件上传,没有其他第三方库
  • 应用程序的小型开销,一切只有25kb
  • 针对不稳定的移动连接优化的自动智能请求重试
  • 自动gzip响应解码支持超快请求
  • 使用BinaryHttpResponseHandler
  • 下载的二进制文件(图像等)
  • 使用JsonHttpResponseHandler解析为JSON的内置响应
  • 持久性Cookie存储,将Cookie保存到您应用的SharedPreferences

你也可以尝试fastjson这是一个快速的json处理器。