JSON: парсератор потока Джексона - действительно ли это стоит?

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

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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

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

BTW: банкомат только для GSON имеет размер только 14 КБ, поэтому ничего не нужно беспокоиться.

Ответ 3

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

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