Подтвердить что ты не робот

Сравнение производительности и удобства использования Android JSON-библиотек

Какая лучшая библиотека для разбора JSON на Android. Я знаю, что в платформе Android есть библиотека JSON, и я слышал о GSON. Но мне интересно, сравнил ли кто-нибудь различные варианты JSON на Android и придумал оправдание выбора одного из них. Я думаю о производительности и удобстве использования в качестве основных критериев.

4b9b3361

Ответ 1

Хотя существует несколько API-интерфейсов Java-to/from-JSON, которые обеспечивают легкую (базовую) привязку между JSON и произвольной структурой данных Java, Jackson и Gson на сегодняшний день являются самыми сложными (способными) и многофункциональными варианты.

В июле (2011) я опубликовал многосерийную серию в своем блоге, сравнивая использование Gson против Jackson, перешагнув функции, поскольку они были организованы в Руководстве пользователя Gson, включая примеры сопоставимых реализаций в Jackson (и реализаций в Gson, где Руководство пользователя Gson было неполным или сломанным).

В шестой части серии представлены удобные ссылки для сравнения, а также сводный список сравнения. http://programmerbruce.blogspot.com/2011/07/gson-v-jackson-part-6.html

Это наиболее полное сравнение использования Gson против Jackson для известных известных задач JSON-to/from-Java.

Как уже упоминалось, сравнение производительности различных API-интерфейсов Java-to/from-JSON доступно в https://github.com/eishay/jvm-serializers/wiki. Текущая версия Gson (2.0) показывает примерно в 16 раз медленнее, чем текущая версия Jackson (1.9.2) при сериализации и десериализации 500-байтовой структуры JSON с использованием очень сопоставимых усилий по внедрению (всего одна или две строки кода).

Мартин Адамек опубликовал некоторые результаты производительности различных API, работающих на Android, в http://martinadamek.com/2011/01/31/comparison-of-json-parsers-performance-on-android/ и http://martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/

Ответ 2

GSON действительно прост в использовании, и если производительность не проблема, это довольно хорошо. Jackson намного, намного быстрее, хотя и на самом деле не так много усилий для использования. Как я уже сказал в прошлом в другом связанном с этим вопросе, я получил огромную прибыль от производительности (при работе с большими наборами JSON), просто переключившись на Jackson из GSON.

Ответ 3

Ну, иногда производительность и удобство использования могут быть несовместимы, но я нашел GSON более простым в использовании, чем альтернативы типа Jackson, org.json и другие. Я в настоящее время сериализую данные JSON, у которых есть объекты и списки 3 или 4 уровня. Это говорит о том, что я настроил мой JSON более подходящим для сериализации, но в целом GSON был отличным.

Ответ 4

Этот ответ рассматривается с точки зрения памяти, так как это также можно рассматривать как производительность: -P.

Я только что реализовал синтаксический анализ файла JSON на 70 КБ в Android, разбор массива объектов, которые должны либо загружаться с нуля, либо обновлять ранее существующие объекты привязки данных по всему HTTP.

Самый большой недостаток встроенного пакета org.json для runtime 3 для Android был

  • Конструктор JSONTokener принимает только строку, без чтения
  • отсутствие практической поддержки для синтаксического разбора

Это обычно означает, что вам необходимо сохранить весь файл в памяти (подумайте об увеличении размера двух байтов) и, кроме того, одновременно удерживайте все результирующие объекты JSON в памяти, прежде чем приступать к связыванию данных. В худшем случае это 2x размер файла, объекты JSON и объекты привязки данных - как правило, как минимум 2x требования к памяти.

Если вы попытаетесь разобраться с читателем, вы можете получить это до 1 раза. Это самая важная вещь, которую вы можете сделать с точки зрения памяти.

И, удивляя удивление, если вы пойдете с некоторыми более современными классами, такими как Джексон или только самые свежие источники из org.json, вы сможете обойти эти ограничения без проблем, более поздняя версия для Android также, похоже, имеют некоторые классы полезности для JSON pull-parsing.

Если вы застряли в старой среде исполнения и хотите сохранить снимок приложения, как и я, вы можете скопировать JSONTokener из org.json и изменить цикл синтаксического анализа верхнего уровня (в моем случае синтаксический анализ массива loop) и привязывать данные к каждому элементу массива вместо всего массива сразу. Таким образом, вы как можно больше повторно используете объекты JSON уже в среде выполнения android и получаете эффект потоковой передачи (по цене добавления идентификаторов для каждого объекта верхнего уровня).

Ответ 5

Android JSON очень функциональный, но не имеет свистов. Где в качестве GSON вы можете указать сопоставления между вашими классами и их json-представлением. Он также имеет очень приятное автоматическое преобразование любых примитивных значений в json, без дополнительной работы с вашей стороны.

Выплата с помощью GSON заключается в том, что у вас много JSON communcaion или сложных объектов, которые требуют проверки ценности для предотвращения незаконных значений (например, NaN) и других случаев, когда java-to-JSON меньше, чем прямо.

Но если вам просто нужно отправить и получить простой json-объект, то собственная библиотека делает этот прием довольно прилично. Я использую его в своем текущем проекте, чтобы отправлять высокие оценки на сервер.

Ответ 6

Я тестирую GSON и пробовал некоторые другие.

GSON отлично справляется с сериализацией (конвертированием объектов в json) сложных объектов, в основном без изменений или мысли с вашей стороны, но немного медленная и интенсивная память.

Веб-сайт GSON Roadmap указывает, что они ожидают, что версия 2.0 рассмотрит некоторые проблемы с производительностью и что она выйдет в октябре 2011 года (заканчивается в ближайшее время). Поэтому я надеюсь, что они это сделают, потому что мне это действительно нужно.

Другие библиотеки (извините, что не могут сразу вспомнить имена), похоже, не сериализуются. Некоторые могут просматривать только общедоступные переменные в ваших классах или просто вызывать общедоступные методы, которые выглядят как getters/seters. Гсон не делает этого таким образом и будет хватать все.

Я еще многого не делал на стороне десериализации (преобразование JSON обратно в объекты Java).

Ответ 7

попробуйте android-async-http

  • Сделать асинхронные HTTP-запросы, обрабатывать ответы в анонимных обратных вызовах
  • HTTP-запросы происходят за пределами потока пользовательского интерфейса.
  • Запросы используют threadpool для ограничения одновременного использования ресурсов.
  • GET/POST params builder (RequestParams)
  • Загрузка многостраничных файлов без дополнительных сторонних библиотек
  • Небольшой размер накладных расходов для вашего приложения, всего 25 кб для всего
  • Автоматические запросы интеллектуального запроса, оптимизированные для пятнистых мобильных соединений.
  • Автоматическая поддержка декодирования ответов gzip для сверхбыстрых запросов
  • Загрузка двоичного файла (изображений и т.д.) с помощью BinaryHttpResponseHandler
  • Встроенный парсинг ответов в JSON с JsonHttpResponseHandler
  • Постоянный хранилище файлов cookie сохраняет файлы cookie в ваши приложения. SharedPreferences

а также вы можете попробовать fastjson, который является быстрым процессором json.