15

我正在编写的应用程序中大量使用 JSON 解析。我所做的大部分工作已经使用 Android 内置的 JSONObject 库(是 json-lib 吗?)实现。

JSONObject 似乎创建了 JSON 字符串中绝对所有内容的实例......即使我最终没有使用所有这些实例。

我的应用程序目前运行良好,即使在 G1 上也是如此。

我的问题是:使用像 Jackson 这样的流解析器所带来的速度和内存优势值得所有麻烦吗?

麻烦,我的意思是:据我所知,使用 Jackson 而不是内置库有三个缺点:

  1. 对外部库的依赖。这最终使您的 .apk 更大。没什么大不了的。
  2. 您的应用程序更脆弱。由于解析不是自动完成的,因此它更容易受到它正在解析的 JSON 文本的更改的影响(也许我错了)。
  3. 通过流解析器编写代码来解析 JSON 既丑陋又乏味。
4

3 回答 3

6

在大多数情况下,我也在使用内置 JSON 解析器,但最近遇到了一个不适合的场景:对于一些 Web 服务请求,我收到超过 1 MB 的 JSON 文档。使用内置 JSON 解析器加载这些需要大量的主内存,并导致OutOfMemoryException多次。对于这些场景,流式解析器是更好的选择(尽管使用起来更不方便),并且内置的 JSON 解析器不提供流式传输,而仅提供类似 DOM 的样式。

对于正在寻找适用于 Android 的流式 JSON 解析器的任何人,我强烈建议您使用Google 的 GSON。我一开始尝试过 Jackson JSON,它运行良好,直到我尝试构建我的应用程序的发布版本:ProGuard 报告了几个问题,并且正在运行的应用程序在NullPointerExceptionJackson 的构造函数中神秘地崩溃了ObjectMapper(尽管在调试版本中一切正常) . 即使经过几个小时的尝试,我也无法解决这个问题。然后我切换到 GSON,一切都像魅力一样。

顺便说一句:仅 GSON 流媒体的 jar 的大小只有 14kB ——所以没什么好担心的。

于 2011-06-17T09:54:27.137 回答
2

猜猜你已经回答了你自己的问题。:)
我自己使用内置的 JSON 解析器,从未寻找过替代方案。

编辑:现在我正在使用DroidParts的基于注释的薄包装器。

于 2010-03-18T03:45:47.627 回答
2

我认为问题是内置的是否足够好。如果是的话,当然,最小化依赖关系通常是一个好策略。足够好可以指效率和易用性。

值得一提的是,Jackson 还有一个不错的树模型以及完整的数据绑定。树模型比默认解析器快得多(解析在 J2SE 上快 3 到 5 倍,在 Android 等其他平台上可能类似,树模型本身也可能更有效)。或者:如果您不希望依赖于第二个 jar(树模型和数据绑定需要映射器),那么编写自己的树来覆盖您的用例也很简单。要么使用基本的 HashMap/ArrayList/wrappers,或者如果你愿意,也可以拥有自己的类。生成器可能是 40 行代码。

于 2010-03-22T17:03:08.943 回答