Джексон против Гсон [закрыто]

363

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

  • Джексон
  • Google GSon

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

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

Сурадж Чандран
источник
3
Кроме того, для использования Android последний тест производительности, который я видел, состоит в следующем: martinadamek.com/2011/02/04/…
StaxMan
7
Одно быстрое замечание: любой, кто выбирает GSon, должен обязательно использовать 2.1 - его производительность, наконец, заметно лучше, чем в предыдущих версиях.
StaxMan
46
На данный момент, имея 74 голоса "за", этот вопрос, очевидно, имеет несколько ценных ответов. Хорошие ответы бьют "неконструктивные" вопросы. Голосование возобновить.
Николай
1
Документация Джексона сейчас становится невероятно сложной. , ,
dongshengcn

Ответы:

117

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

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

mickthompson
источник
2
Кроме того, Google GSon пока не поддерживает циклические ссылки. Джексон справляется с ними?
Гвидо
1
Поддержка циклических ссылок ... это должно быть основной функцией, но я не уверен, поддерживает ли она их, пока я никогда не встречал циклические ссылки (даже если они должны быть довольно распространенными, я думаю, особенно в модели) , Вот еще один тест, который может показать, насколько быстр Джексон по сравнению с GSon. В сериализации / десериализации он выглядит в 100 раз быстрее code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson,
1
Джексон в настоящее время не обрабатывает циклические ссылки. Если это важно, XStream делает; не уверен, что какой-нибудь нативный пакет json делает (возможно, flex-json?)
StaxMan
11
Начиная с версии 1.6, Джексон поддерживает циклические ссылки. См. Обработка двунаправленных ссылок с использованием декларативных методов для ссылки.
Офир Радниц
У Джексона больше проблем с безопасностью, учитывая необходимость укрепления
TuGordoBello
83

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

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

  • Обширная поддержка аннотаций; включая полное наследование и расширенные аннотации "mix-in" (свяжите аннотации с классом для случаев, когда вы не можете напрямую добавить их)
  • Потоковое (инкрементное) чтение, запись для сценариев использования со сверхвысокой производительностью (или с ограниченным объемом памяти); может смешиваться с привязкой данных (связывать поддеревья) - РЕДАКТИРОВАТЬ : последние версии Gson также включают потоковую чтения
  • Древовидная модель (DOM-подобный доступ); можно конвертировать между различными моделями (дерево <-> объект Java <-> поток)
  • Может использовать любые конструкторы (или статические фабричные методы), а не просто конструктор по умолчанию
  • Доступ к полям и получателям / установщикам (более ранние версии gson использовали только поля, это могло измениться)
  • Встроенная поддержка JAX-RS
  • Функциональная совместимость: также можно использовать аннотации JAXB, есть поддержка / обходные пути для общих пакетов (joda, ibatis, cglib), языки JVM (groovy, clojure, scala)
  • Возможность принудительной обработки статического (объявленного) типа для вывода
  • Поддержка десериализации полиморфных типов (Jackson 1.5) - может сериализовать и десериализовать такие вещи, как List (с дополнительной информацией о типах)
  • Интегрированная поддержка двоичного контента (base64 в / из строк JSON)
StaxMan
источник
6
На самом деле, этот пост - cowtowncoder.com/blog/archives/2010/11/entry_434.html - содержит краткий обзор многих функций Джексона, которых нет в других пакетах.
StaxMan
12
Я бы посоветовал не требовать, чтобы аннотации были свойством GSON, а не недостатком (который вы перечислили как минимум 3 раза выше).
orbfish
6
Ни Джексон, ни Гсон не требуют использования аннотаций. Но наличие аннотаций в качестве опции является ценной особенностью, по моему мнению (особенно «аннотации встраивания», которая является дополнительной опцией обработки, позволяющей связать внешнюю конфигурацию).
StaxMan
3
Gson позволяет вам зарегистрировать InstanceCreator, чтобы указать альтернативный способ создания экземпляра вместо использования конструктора по умолчанию.
Инд
37

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

Индера
источник
Мне было бы интересно увидеть измерение, которое подтверждает это. По крайней мере, измерения по адресу: wiki.fasterxml.com/JacksonInFiveMinutes по- прежнему указывают на то, что GSON не конкурентоспособен с другими пакетами Java json.
StaxMan
1
У нас есть микро-тесты (проверенные в хранилище Subversion Gson в каталоге trunk / metrics), которые показывают, что при простых преобразованиях объектов низкоуровневый API потоковой передачи может быть в 10 раз быстрее. Также есть и другие тесты (которые я должен рекомендовать опубликовать первоначальному автору), что этот низкоуровневый API в настоящее время превосходит другие библиотеки, включая Джексона. Однако создание всеобъемлющих и репрезентативных контрольных показателей займет некоторое время и усилия.
Индера
3
Еще одна точка данных: jvm-serializer ( github.com/eishay/jvm-serializers ) теперь имеет тест «gson / manual», который использует потоковый API GSON в качестве альтернативы привязке данных. Как только автор введет «официальные» номера, вики может быть обновлена. Но из-за того, что я запускаю это локально, я не думаю, что он поддерживает заявления о том, что он супер быстрый
StaxMan
12
(дополнение к вышесказанному: официальные цифры были включены - потоковая передача Gson быстрее, чем привязка к данным, но не до уровня производительности Джексона)
StaxMan
9
... для всех, кто следит, Gson 2.1, в конце концов, придумал значительные и ощутимые улучшения производительности.
StaxMan
13

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

Вот две ссылки по теме

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

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

snegi
источник
Фрагмент поддержки чувствительности к регистру в Джексоне не работает . Вернее, он работает только для свойств верхнего уровня. Попробуйте вложить свойство, и вы увидите, что ваше решение не работает.
Андрес Ф.
1
На самом деле существует формальная поддержка нечувствительных к регистру свойств MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, добавленных в Jackson 2.5. Поэтому нет необходимости добавлять собственный код для этого.
StaxMan
6

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

raymond.mh.ng
источник
Если у вас уже есть аннотации к вашим классам данных для Hibernate, вам все равно не нужен другой набор для JAXB.
orbfish
1
Приятно иметь возможность добавлять поддержку "чужих" аннотаций. Джексон имеет дополнительный модуль аннотаций JAXB, а также модуль Hibernate для нескольких своих аннотаций (для кратковременных, отложенных загрузок). Возможно, можно расширить Gson, чтобы разрешить и модульные расширения.
StaxMan
2
Тем более, что JAXB - это стандарт!
maxxyme