JSON:Jackson 流解析器 - 真的值得吗?[关闭]
题
我正在编写的应用程序中大量使用 JSON 解析。我所做的大部分工作已经使用 Android 内置的 JSONObject 库(是 json-lib 吗?)实现。
JSONObject 似乎创建了 JSON 字符串中所有内容的实例......即使我最终没有使用所有这些。
我的应用程序目前运行得很好,即使在 G1 上也是如此。
我的问题是这样的:使用像 Jackson 这样的流解析器所带来的速度和内存优势值得所有的麻烦吗?
我所说的麻烦是指:据我所知,使用 Jackson 而不是内置库有三个缺点:
- 对外部库的依赖。这最终会让你的 .apk 变得更大。没什么大不了的。
- 您的应用程序更加脆弱。由于解析不是自动完成的,因此它更容易受到正在解析的 JSON 文本更改的影响(也许我对此是错的)。
- 编写代码通过流解析器解析 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 行代码。