2010-03-18 2 views
15

Я использую синтаксический разбор JSON в приложении, которое я пишу. Большинство из того, что я сделал, уже реализовано с использованием встроенной в JSONObject библиотеки Android (это json-lib?).JSON: Джексон поток парсер - это действительно стоит?

JSONObject, похоже, создает экземпляры абсолютно всех в строке JSON ... даже если я не использую их все.

Мое приложение работает довольно хорошо, даже на G1.

Мой вопрос заключается в следующем: нужны ли скорости и памяти преимущества использования парсера потока, такого как Джексон, на все проблемы?

К беде, я имею в виду это: Насколько я могу судить, есть три отрицательные стороны использования Джексона вместо встроенного в библиотеке:

  1. Зависимость от внешней библиотеки. Это делает ваш .apk больше в конце. Не огромная сделка.
  2. Ваше приложение более хрупкое. Поскольку разбор не выполняется автоматически, он более уязвим для изменений текста JSON, которые он разбор (возможно, я ошибаюсь в этом).
  3. Написание кода для разбора JSON через анализатор потока является уродливым и утомительным.
+1

Я не согласен с № 2. Если структура JSON изменяется неожиданным образом, вам действительно не повезло. –

+0

Не верно в некоторых случаях .. например, добавление объекта в качестве значения в другой объект. Если вы не планируете его в парсинге вытягивания, он его выкинет, а с JSONObject он будет работать. Например: Изменение { "first_name": "Адам", "last_name": "Olsen" } к { "first_name": "Адам, " last_name: "Olsen", "phone_numbers": { "дом": "555-867-5309", "работа": "888-555-5555" }} бросить бы ваш парсер прочь в цикле, как: в то время как (синтаксический анализатор .nextToken()! = JsonToken.END_OBJECT) - В конце концов вы попадете END_OBJECT, где JSONObject будет разбирать его в порядке. – synic

+0

Можно написать анализатор потока, который справляется с этим. Я считаю, что это то, что для ShipChildren (http://jackson.codehaus.org/1.5.0/javadoc/org/codehaus/jackson/JsonParser.html#skipChildren%28%29). –

ответ

2

Угадайте, что вы в значительной степени ответили на свой вопрос. :)
С помощью встроенного анализатора JSON я и никогда не искал альтернативы.

EDIT: Теперь я использую тонкую обертку на основе аннотаций от DroidParts.

2

Я думаю, вопрос заключается в том, является ли встроенный один достаточно хорошим. Если это так, конечно, минимизация зависимостей часто является хорошей стратегией. Достаточно хорошее может относиться как к эффективности, так и к простоте использования.

Для того, что стоит, у Джексона также есть достойная древовидная модель, а также полная привязка данных. Древовидная модель значительно быстрее, чем парсер по умолчанию (синтаксический анализ на J2SE на 3x-5 раз быстрее, вероятно, аналогично на других платформах, таких как Android, сама модель дерева также более эффективна). Или: если вам не нужна зависимость от второй банки (необходим сопоставление для древовидной модели и привязки данных), писать собственное дерево для покрытия ваших случаев использования тоже просто. Либо используйте базовые HashMap/ArrayList/wrappers, либо имеете свои собственные классы, если хотите. Builder будет, возможно, 40 строк кода.

6

Я также использую встроенный анализатор JSON в большинстве случаев, но недавно перешел в сценарий, где он не подходит: для некоторых запросов веб-сервисов я получаю документы JSON объемом более 1 МБ. Загрузка их с помощью встроенного анализатора JSON требует огромных объемов основной памяти и несколько раз приводила к OutOfMemoryException. Для этих сценариев лучше всего использовать потоковой парсер (хотя он более неудобен в использовании), а встроенный анализатор JSON не обеспечивает потоковую передачу, а только стиль, подобный DOM.

Для тех, кто ищет потоковый анализатор JSON для Android, я могу настоятельно рекомендовать использовать Google's GSON. Сначала я пробовал Jackson JSON, и он работал нормально до тех пор, пока я не попытался создать версию моего приложения: ProGuard сообщил о нескольких проблемах, и запущенное приложение разбилось с таинственным NullPointerException в конструкторе Jackson's ObjectMapper (хотя все отлично работало в отладке версия). Даже после нескольких часов попыток я не смог это исправить. Затем я переключился на GSON, и все работало как шарм.

BTW: Банкомат GSON только для потокового вещания имеет размер только 14 КБ - так что не о чем беспокоиться.

+1

Оказывается, есть способ сделать контент ProGuard; мой коллега понял это. Я надеюсь убедить его в блоге о деталях, поскольку это, к сожалению, не однострочный. В основном слабость ProGuard заключается в том, что он опирается на статический анализ, который сталкивается с проблемами с отражением. Следует отметить, что если использовать только потоковый материал Джексона (JsonParser, JsonGenerator) из основной банки, проблем не должно быть. Это часть картера, которая сильно использует отражение. – StaxMan

+0

Не могли бы вы указать на те, которые запущены в проблему NullPointerException в общем направлении решения, если мы должны использовать карту? – kwogger

+0

Как упоминалось в моем посте, я не нашел решение для 'NullPointerException'. Вот почему я переключился на GSON. – sven

Смежные вопросы