2010-03-04 10 views
307

После поиска через некоторые существующие библиотеки для JSON, я, наконец, в конечном итоге с этим два:Jackson Vs. Gson

  • Джексон
  • Google GSon

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

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

+3

Кроме того, для использования Android, последний тест производительности я видел это: http://www.martinadamek.com/2011/02/04/json-parsers-performance-on-android-with-warmup-and-multiple-iterations/ – StaxMan

+1

[Последний тест производительности CowTalk.] (http: //www.cowtowncoder.com/blog/archives/2011/01/entry_438 .html # links) - 08 января 2011 г. – Iogui

+7

Однократное замечание: любой, кто выбирает GSon, должен обязательно использовать 2.1 - его производительность, наконец, заметно лучше предыдущих версий. – StaxMan

ответ

98

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

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

+2

Кроме того, Google GSon еще не поддерживает циркулярные ссылки. Джексон справляется с ними? –

+0

Поддержка Circular References ... это должна быть основная функция, но я не уверен, поддерживает ли она их, я до сих пор не встречал круглых ссылок (даже если они должны быть довольно распространенными, я думаю, особенно в модели). Вот еще один тест, который может подчеркнуть, насколько быстро Джексон по сравнению с GSon. Он выглядит в 100 раз быстрее в сериализации/десериализации http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking – mickthompson

+1

В настоящее время Джексон не обрабатывает круговые ссылки. Если это важно, XStream делает; не уверен, что какой-либо родной пакет json (возможно, flex-json?) – StaxMan

77

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

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

  • Широкой поддержку аннотаций; включая полное наследование и расширенные аннотации «mix-in» (ассоциировать аннотации с классом для случаев, когда вы не можете их напрямую добавлять)
  • Потоковое (инкрементное) чтение, запись, для сверхвысокой производительности (или ограниченного объемом памяти) случаи использования; может сочетаться с привязкой данных (привязать поддеревья) - EDIT: последние версии Gson также включают в себя потоковый считыватель
  • Древовидная модель (DOM-подобный доступ); может конвертировать между различными моделями (деревом < -> объект Java < -> поток)
  • Можно использовать любые конструктор (или статические фабричные методы), а не только конструктор по умолчанию
  • поля и геттер/сеттер доступа (более ранние версии gson используется только поля, это может быть изменено)
  • Out из коробки JAX-RS поддерживают
  • Interoperability: также можно использовать JAXB аннотации, имеет поддержку/обходные для общих пакетов (Joda, Ibatis, CGLIB), языки виртуальной машины Java (groovy, clojure, scala)
  • Возможность принудительной обработки статического (объявленного) типа для вывода
  • Поддержка десериализации полиморфных типов (Jackson 1,5) - может сериализации и десериализации вещи, как список правильно (с дополнительной информацией о типе)
  • Интегрированная поддержка для бинарного контента (base64 в/из JSON строк)
+6

Собственно, этот пост - http://www.cowtowncoder.com/blog/archives/2010/11/entry_434.html - обобщает многие функции Джексона, которые не найдены в других пакетах. – StaxMan

+8

Я бы не хотел, чтобы аннотации были признаком GSON, а не недостатком (который вы указали как минимум 3 раза выше). – orbfish

+3

Ни Джексон, ни Гсон не требуют использования аннотаций. Но наличие аннотаций в качестве опции является ценной функцией в моем мнении (например, «аннотации микширования»), которая является дополнительной опцией обработки, позволяющей связывать внешнюю конфигурацию). – StaxMan

33

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

+0

Мне было бы интересно увидеть измерение, которое поддерживает это. По крайней мере, измерения по адресу: http://wiki.fasterxml.com/JacksonInFiveMinutes по-прежнему показывают, что GSON не конкурирует с другими пакетами Java json. – StaxMan

+1

У нас есть доступные микро-контрольные отметки (проверено в репозитории Goun subversion в каталоге trunk/metrics), которые показывают, что при простых преобразованиях объектов потоковый API низкого уровня может быть быстрее на 10 раз быстрее. Существуют и другие эталонные тесты (которые я должен поощрять опубликовать оригинального автора), что этот низкоуровневый API в настоящее время превосходит другие библиотеки, включая Jackson. Однако для создания всеобъемлющих и репрезентативных контрольных показателей потребуется некоторое время и усилия. – inder

+3

Еще одна точка данных: jvm-serializers (https://github.com/eishay/jvm-serializers) теперь имеет тест «gson/manual», который использует GSON streaming api как альтернативу привязке данных. Когда автор запускает «официальные» номера, вики могут быть обновлены. Но из-за запуска этого локально я не думаю, что он поддерживает заявления о том, что они очень быстрые. – StaxMan

5

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

+0

Если у вас уже есть аннотации к вашим классам данных для Hibernate, вы не хотите, чтобы еще один набор для JAXB. – orbfish

+1

Приятно иметь возможность добавлять поддержку для «иностранных» аннотаций. У Jackson есть дополнительный модуль аннотации JAXB, а также модуль Hibernate для пары его аннотаций (для удобства, ленивой загрузки). Возможно, Gson может быть расширен, чтобы расширять модульные расширения. – StaxMan

+1

Тем более, что JAXB является стандартом! – maxxyme

10

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

Вот два родственных связей

(Нет) поддержка чувствительности к регистру в Gson: GSON: How to get a case insensitive element from Json?

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

+0

Фрагмент для поддержки чувствительности к регистру в Jackson ** не работает **. Вернее, он работает только для свойств верхнего уровня. Попробуйте вложить свойство, и вы увидите, что ваше решение не работает. –

+0

На самом деле существует формальная поддержка нечувствительных к регистру свойств, «MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES», добавленная в Jackson 2.5. Поэтому нет необходимости добавлять к нему специальный код. – StaxMan

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