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

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

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

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

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

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

解决方案

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

编辑:现在我正在使用一个基于注释的薄包装器 机器人零件.

其他提示

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

对于任何正在寻找适用于 Android 的流式 JSON 解析器的人,我强烈建议使用 谷歌的GSON. 。我一开始尝试过 Jackson JSON,它工作得很好,直到我尝试构建我的应用程序的发布版本:ProGuard 报告了几个问题,正在运行的应用程序因神秘而崩溃 NullPointerException 在杰克逊的构造函数中 ObjectMapper (尽管在调试版本中一切正常)。即使经过几个小时的尝试,我也无法解决这个问题。然后我切换到 GSON,一切都很顺利。

顺便提一句:GSON 仅流式处理 jar 的大小只有 14kB——所以没什么好担心的。

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

就其价值而言,杰克逊还拥有一个不错的树模型以及完整的数据绑定。树模型比默认解析器快得多(在 J2SE 上解析速度快 3-5 倍,在 Android 等其他平台上可能类似,树模型本身也可能更高效)。或者:如果您不想依赖第二个 jar(树模型和数据绑定需要映射器),则编写自己的树来覆盖您的用例也很简单。可以使用基本的 HashMap/ArrayList/wrappers,也可以根据需要使用自己的类。Builder 顶部可能有 40 行代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top