JSON:杰克逊流解析器 - 它真的值得吗?

时间:2010-03-18 03:20:05

标签: android json jackson

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

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

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

我的问题是:使用像杰克逊这样的流解析器的速度和内存优势是否值得所有麻烦?

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

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

3 个答案:

答案 0 :(得分:6)

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

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

BTW:GSON仅限流媒体的jar只有14kB的大小 - 所以没什么好担心的。

答案 1 :(得分:2)

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

编辑:现在我正在使用来自DroidParts的基于注释的精简包装器。

答案 2 :(得分:2)

我认为问题在于内置的内容是否足够好。如果确实如此,那么最小化依赖关系通常是一个很好的策略。足够好可以指效率和易用性。

对于它的价值,杰克逊还有一个不错的树模型以及完整的数据绑定。 树模型明显快于默认解析器(解析在J2SE上快3x-5x,可能类似于其他平台,如Android,树模型本身也可能更高效)。 或者:如果您不希望依赖于第二个jar(树模型和数据绑定需要映射器),编写自己的树来覆盖您的用例也很简单。如果您愿意,可以使用基本的HashMap / ArrayList /包装器,也可以使用自己的类。 Builder可能是40行代码。