Джексон против. Гсон

После поиска в некоторых существующих библиотеках для JSON я наконец остановился на этих двух:

  • Джексон
  • Гугл Гсон

Я немного неравнодушен к GSON, но в сети говорят, что Gson страдает от определенных небесных характеристик выпуск (по состоянию на сентябрь 2009 г.).

Я продолжаю свое сравнение; в то же время, я ищу помощь, чтобы принять решение.


person Suraj Chandran    schedule 04.03.2010    source источник
comment
Кроме того, для использования Android последний тест производительности, который я видел, выглядит следующим образом: and-multiple-iterations/" rel="nofollow noreferrer">martinadamek.com/2011/02/04/   -  person StaxMan    schedule 16.02.2011
comment
Последний тест производительности CowTalk. — 8 января 2011 г. 2011   -  person Iogui    schedule 24.02.2011
comment
Небольшое замечание: любой, кто выбирает Gson, должен обязательно использовать 2.1 — его производительность, наконец, заметно лучше, чем в более ранних версиях.   -  person StaxMan    schedule 12.02.2012
comment
С 74 голосами на данный момент этот вопрос, очевидно, имеет несколько ценных ответов. Хорошие ответы важнее неконструктивных вопросов. Голосование за открытие.   -  person Nicholas    schedule 23.08.2013
comment
Документация Джексона становится до смешного сложной. . .   -  person dongshengcn    schedule 17.09.2013
comment
@dongshengcn, возможно, для более сложных функций, но основное использование такое же, как и всегда. Со всей функциональностью, охватывающей полиморфную типизацию, обработку истинной идентичности объекта и т. д., также необходимо описать сложную обработку.   -  person StaxMan    schedule 13.03.2015
comment
Примечание для пользователей Android: gson 2.6.2: 1329 методов, jackson-databind 2.7.3: 10753 метода. Источник: methodscount.com   -  person Denis Kniazhev    schedule 19.04.2016
comment
Привет, я просто хочу поделиться с вами этой ссылкой, возможно, вы сможете использовать ее для новых проектов: jsoniter.com   -  person Chris Sim    schedule 16.01.2017
comment
Сравнение на основании чего? вопрос все еще слишком широк .. пожалуйста, сделайте его больше, чтобы снова открыть вопрос.   -  person Maher Abuthraa    schedule 19.03.2017
comment
Вопрос слишком широкий. Но это сравнение функций может помочь. itsallbinary.com/ . В основном вам нужно ориентироваться на функции, которые вам нужны, чтобы выбрать правильную библиотеку среди лучших библиотек json.   -  person Ravi K    schedule 06.07.2019


Ответы (5)


Я провел это исследование на прошлой неделе и получил те же две библиотеки. Поскольку я использую Spring 3 (который принимает Джексона в представлении Json по умолчанию 'JacksonJsonView') для меня было более естественным сделать то же самое. 2 библиотеки почти одинаковы... в конце они просто сопоставляются с файлом json! :)

В любом случае, как вы сказали, у Jackson есть плюс в производительности, и это очень важно для меня. Проект также довольно активен, как вы можете видеть на их веб-странице, и это тоже очень хороший знак.

person mickthompson    schedule 04.03.2010
comment
Кроме того, Google Gson еще не поддерживает циклические ссылки. Джексон справляется с ними? - person Guido; 05.03.2010
comment
Поддержка циклических ссылок... это должно быть основной функцией, но я не уверен, поддерживает ли она их, до сих пор я никогда не сталкивался с циклическими ссылками (даже если они должны быть довольно распространенными, я думаю, особенно в модели) . Вот еще один тест, который может показать, насколько быстр Джексон по сравнению с Gson. Он выглядит в 100 раз быстрее при сериализации/десериализации code.google.com/p/ thrift-protobuf-compare/wiki/Бенчмаркинг - person mickthompson; 05.03.2010
comment
В настоящее время Джексон не обрабатывает циклические ссылки. Если это важно, XStream делает это; не уверен, что какой-либо нативный пакет json работает (возможно, flex-json?) - person StaxMan; 12.03.2010
comment
Начиная с версии 1.6, Джексон поддерживает циклические ссылки. Для справки см. раздел Обработка двунаправленных ссылок с помощью декларативных методов. - person Ophir Radnitz; 11.04.2011
comment
У Джексона больше проблем с безопасностью, в связи с необходимостью укрепления - person TuGordoBello; 11.04.2019

Jackson и Gson — наиболее полные пакеты Java JSON с точки зрения фактической поддержки привязки данных; многие другие пакеты предоставляют только примитивную привязку Map/List (или эквивалентную древовидную модель). Оба имеют полную поддержку универсальных типов, а также достаточную конфигурируемость для многих распространенных случаев использования.

Поскольку я лучше знаком с Джексоном, вот некоторые аспекты, в которых Джексон имеет более полную поддержку, чем Gson (извините, если я пропущу функцию Gson):

  • Расширенная поддержка аннотаций; включая полное наследование и расширенные аннотации «mix-in» (связывание аннотаций с классом в случаях, когда вы не можете добавить их напрямую)
  • Потоковое (инкрементное) чтение, запись для случаев использования со сверхвысокой производительностью (или с ограниченным объемом памяти); может смешиваться с привязкой данных (привязывать поддеревья) -- EDIT: последние версии Gson также включают потоковое чтение
  • Древовидная модель (доступ по типу DOM); может конвертировать между различными моделями (дерево ‹-> java-объект ‹-> поток)
  • Может использовать любые конструкторы (или статические фабричные методы), а не только конструктор по умолчанию.
  • Доступ к полям и геттеру/сеттеру (в более ранних версиях gson использовались только поля, это могло измениться)
  • Встроенная поддержка JAX-RS
  • Совместимость: также может использовать аннотации JAXB, имеет поддержку/обходные решения для распространенных пакетов (joda, ibatis, cglib), языков JVM (groovy, clojure, scala)
  • Возможность принудительной обработки статического (объявленного) типа для вывода
  • Поддержка десериализации полиморфных типов (Jackson 1.5) — может правильно сериализовать И десериализовать такие вещи, как List (с дополнительной информацией о типе)
  • Интегрированная поддержка двоичного содержимого (base64 в/из строк JSON)
person StaxMan    schedule 12.03.2010
comment
Собственно, этот пост -- cowtowncoder.com/blog/archives/2010/ 11/entry_434.html — содержит сводку многих функций Jackson, которых нет в других пакетах. - person StaxMan; 03.03.2011
comment
Я бы посчитал, что аннотации не должны быть особенностью GSON, а не недостатком (который вы указали как минимум 3 раза выше). - person orbfish; 01.01.2013
comment
Ни Джексон, ни Гсон не требуют использования аннотаций. Но наличие аннотаций в качестве опции, на мой взгляд, является ценной функцией (особенно смешанные аннотации, которые являются дополнительной опцией обработки, позволяющей связывать внешнюю конфигурацию). - person StaxMan; 03.01.2013
comment
Gson позволяет вам зарегистрировать InstanceCreator, чтобы указать альтернативный способ создания экземпляра вместо использования конструктора по умолчанию. - person inder; 11.03.2014

Gson 1.6 теперь включает низкоуровневый потоковый API и новый синтаксический анализатор, который на самом деле быстрее, чем Jackson.

person inder    schedule 21.01.2011
comment
Мне было бы интересно увидеть измерение, подтверждающее это. По крайней мере, измерения на: wiki.fasterxml.com/JacksonInFiveMinutes по-прежнему показывают, что GSON не может конкурировать с другими Java json-пакеты. - person StaxMan; 28.01.2011
comment
У нас есть доступные микротесты (проверено в репозитории Subversion Gson в каталоге trunk/metrics), которые показывают, что при преобразовании простых объектов низкоуровневый потоковый API может быть до 10 раз быстрее. Есть и другие тесты (которые мне нужно побудить автора опубликовать), чтобы этот низкоуровневый API в настоящее время превосходил другие библиотеки, включая Jackson. Однако создание комплексных и репрезентативных эталонных тестов потребует некоторого времени и усилий. - person inder; 07.02.2011
comment
Еще одна точка данных: jvm-serializers (github.com/eishay/jvm-serializers) теперь имеет gson/manual test, который использует потоковый API GSON в качестве альтернативы привязке данных. Как только автор запустит «официальные» номера, вики можно обновить. Но из-за локального запуска я не думаю, что он поддерживает заявления о том, что он супер быстрый. - person StaxMan; 08.06.2011
comment
(дополнение к вышеизложенному: были включены официальные цифры - потоковая передача Gson быстрее, чем привязка данных, но не до уровня производительности Джексона) - person StaxMan; 03.05.2012
comment
... для всех, кто следит за этим, Gson 2.1 в конечном итоге добился значительных и измеримых улучшений производительности. - person StaxMan; 17.03.2014

Добавление к другим ответам, уже данным выше. Если для вас важна нечувствительность к регистру, используйте Jackson. Gson не поддерживает нечувствительность к регистру для имен ключей, в отличие от jackson.

Вот две связанные ссылки

(Нет) Поддержка чувствительности к регистру в Gson: GSON: Как получить элемент, нечувствительный к регистру, из Json?

Поддержка чувствительности к регистру в Джексоне https://gist.github.com/electrum/1260489

person snegi    schedule 03.04.2014
comment
Фрагмент поддержки чувствительности к регистру в Jackson не работает. Вернее, это работает только для свойств верхнего уровня. Попробуйте вложить свойство, и вы увидите, что ваше решение не работает. - person Andres F.; 16.10.2015
comment
На самом деле существует формальная поддержка регистронезависимых свойств, MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, добавленных в Jackson 2.5. Поэтому нет необходимости добавлять собственный код для этого. - person StaxMan; 07.01.2016

Кажется, что Gson не поддерживает JAXB. Используя аннотированный класс JAXB для создания или обработки сообщения JSON, я могу использовать тот же класс для создания интерфейса веб-службы Restful с помощью Spring MVC.

person raymond.mh.ng    schedule 24.01.2011
comment
Если у вас уже есть аннотации к вашим классам данных для Hibernate, вам все равно не нужен еще один набор для JAXB. - person orbfish; 01.01.2013
comment
Приятно иметь возможность добавить поддержку иностранных аннотаций. У Джексона есть дополнительный модуль аннотаций JAXB, а также модуль Hibernate для пары своих аннотаций (для временной загрузки, отложенной загрузки). Возможно, Gson можно было бы расширить, чтобы разрешить модульные расширения. - person StaxMan; 17.03.2014
comment
Тем более, что JAXB — это стандарт! - person maxxyme; 21.10.2016