【发布时间】:2011-01-28 20:53:35
【问题描述】:
我正在编写的应用程序中大量使用 JSON 解析。我所做的大部分工作已经使用 Android 内置的 JSONObject 库(是 json-lib 吗?)实现。
JSONObject 似乎创建了 JSON 字符串中绝对所有内容的实例......即使我最终没有使用所有这些实例。
我的应用目前运行良好,即使在 G1 上也是如此。
我的问题是:使用像 Jackson 这样的流解析器所带来的速度和内存优势值得所有麻烦吗?
麻烦,我的意思是:据我所知,使用 Jackson 而不是内置库有三个缺点:
- 依赖于外部库。这最终使您的 .apk 更大。没什么大不了的。
- 您的应用程序更加脆弱。由于解析不是自动完成的,它更容易受到正在解析的 JSON 文本的更改的影响(也许我错了)。
- 编写代码以通过流解析器解析 JSON 既丑陋又乏味。
【问题讨论】:
-
我不同意#2。如果 JSON 结构以意想不到的方式发生变化,那么无论如何你真的很不走运。
-
在某些情况下不正确。例如,将一个对象作为值添加到另一个对象中。除非您在拉解析器中计划它,否则它会丢弃它,而使用 JSONObject,它会正常工作。例如:将 { "first_name": "Adam", "last_name": "Olsen" } 更改为 { "first_name": "Adam, "last_name: "Olsen", "phone_numbers": { "home": "555-867 -5309", "work": "888-555-5555" } } 会让你的拉式解析器在一个循环中关闭,比如:while(parser.nextToken() != JsonToken.END_OBJECT) - 你最终会提前打到 END_OBJECT , JSONObject 可以很好地解析它。
-
可以编写一个流解析器来处理它。我相信这就是 shipChildren (jackson.codehaus.org/1.5.0/javadoc/org/codehaus/jackson/…) 的用途。
-
酷,我去看看。谢谢
-
除非您遇到性能问题,否则 API 在后台执行的操作并不重要。