我在我正在编写的应用程序中大量使用JSON解析。我所做的大部分工作已经使用Android内置的JSONObject库实现(是json-lib吗?)。
JSONObject似乎创建了JSON字符串中绝对所有内容的实例......即使我最终没有使用它们。
我的应用程序目前运行得非常好,即使在G1上也是如此。
我的问题是:使用像杰克逊这样的流解析器的速度和内存优势是否值得所有麻烦?
麻烦,我的意思是:据我所知,使用杰克逊而不是内置库有三个缺点:
答案 0 :(得分:6)
我在大多数情况下也使用内置JSON解析器,但最近步入了一个不适合的场景:对于某些Web服务请求,我收到超过1 MB的JSON文档。使用内置JSON解析器加载这些内容需要大量的主内存,并导致OutOfMemoryException
几次。对于这些场景,流式解析器是更好的选择(即使它在使用中更不方便),并且内置的JSON解析器不提供流式传输,而只提供类似DOM的样式。
对于寻找适用于Android的流式JSON解析器的任何人,我强烈建议您使用Google's GSON。我一开始尝试过杰克逊JSON,它一直运行良好,直到我尝试构建我的应用程序的发布版本:ProGuard报告了几个问题,正在运行的应用程序在杰克逊NullPointerException
的构造函数中与神秘的ObjectMapper
崩溃了(虽然在调试版本中一切正常)。即使经过几个小时的尝试,我也无法解决这个问题。然后我转而使用GSON,一切都像魅力一样。
答案 1 :(得分:2)
猜猜你已经回答了自己的问题。 :)
我自己使用内置的JSON解析器,但从未寻找替代方案。
编辑:现在我正在使用来自DroidParts的基于注释的精简包装器。
答案 2 :(得分:2)
我认为问题在于内置的内容是否足够好。如果确实如此,那么最小化依赖关系通常是一个很好的策略。足够好可以指效率和易用性。
对于它的价值,杰克逊还有一个不错的树模型以及完整的数据绑定。 树模型明显快于默认解析器(解析在J2SE上快3x-5x,可能类似于其他平台,如Android,树模型本身也可能更高效)。 或者:如果您不希望依赖于第二个jar(树模型和数据绑定需要映射器),编写自己的树来覆盖您的用例也很简单。如果您愿意,可以使用基本的HashMap / ArrayList /包装器,也可以使用自己的类。 Builder可能是40行代码。