Джексон проти Gson [закрито]


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! :)

Як би ви не сказали, Джексон має + у продуктивності, і це дуже важливо для мене. Проект також досить активний, як ви бачите з їх веб-сторінки, і це дуже хороший знак.


2
Також Google GSon поки не підтримує кругові посилання. Чи справляється з ними Джексон?
Гвідо

1
Підтримка циркулярних посилань ... це має бути основною особливістю, але я не впевнений, чи підтримує їх, я ніколи не стикався з циркулярними посиланнями (навіть якщо вони мають бути досить поширеними, я думаю, особливо в моделі) . Ось ще один орієнтир, який може підкреслити, наскільки швидкий Джексон у порівнянні з GSon. Це виглядає на 100
разів

1
Джексон наразі не обробляє кругові посилання. Якщо це важливо, XStream робить; не впевнений, чи є який-небудь рідний пакет json (можливо, flex-json?)
StaxMan

11
Як і у версії 1.6, Джексон підтримує кругові посилання. Див. Опрацювання двонаправлених посилань, використовуючи декларативні методи для довідки.
Офір Радниц

У Джексона є більше проблем з безпекою, що підтверджують зміцнення
TuGordoBello

83

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

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

  • Широка підтримка анотацій; включаючи повне успадкування та розширені анотації "сумішшю" (пов'язуйте анотації з класом для випадків, коли ви не можете їх безпосередньо додати)
  • Потокове (додаткове) читання, запис для випадків використання ультрависокої продуктивності (або обмеженої пам'яттю); може поєднуватися з прив'язкою даних (зв'язувати піддерева ) - EDIT : останні версії Gson також включають в себе потоковий зчитувач
  • Деревова модель (DOM-подібний доступ); може конвертувати між різними моделями (дерево <-> Java-об'єкт <-> потік)
  • Можна використовувати будь-які конструктори (або статичні заводські методи), а не лише конструктор за замовчуванням
  • Доступ до поля та геттера / сетеру (у попередніх версіях gson використовувались лише поля; це може бути змінено)
  • Підтримка JAX-RS поза коробкою
  • Інтероперабельність: може також використовувати анотації JAXB, має підтримку / робочі навколо для загальних пакетів (joda, ibatis, cglib), мови JVM (groovy, clojure, scala)
  • Можливість примусити статичний (оголошений) тип обробки для виводу
  • Підтримка десеріалізації поліморфних типів (Jackson 1.5) - може серіалізувати та дезаріалізувати такі речі, як List правильно (з додатковою інформацією про тип)
  • Комплексна підтримка бінарного контенту (base64 до / від JSON Strings)

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
У нас є мікро-орієнтири (перевірені в сховищі субверсій Gson в каталозі магістраль / метрики), які показують, що при простих перетвореннях об'єктів API низького рівня потокової передачі може бути на 10 разів швидше. Існують і інші орієнтири (які мені потрібно заохотити оригінального автора до публікації), що цей API низького рівня перемагає інші бібліотеки, включаючи Джексона. Однак створення загальних та репрезентативних орієнтирів потребує певного часу та зусиль.
inder

3
Ще один момент даних: jvm-серіалізатори ( github.com/eishay/jvm-serializer ) тепер має тест "gson / manual", який використовує потоковий api GSON як альтернативу прив'язці даних. Як тільки автор запускає "офіційні" номери, вікі можна оновити. Але від запуску цього локально, я не думаю, що він підтримує твердження про те, що це дуже швидко.
StaxMan

12
(на додаток до вище: офіційні номери були включені - потокове передавання Gson швидше, ніж прив'язка даних, але не до рівня продуктивності Джексона)
StaxMan

9
... для будь-кого, хто підписався, Gson 2.1 врешті-решт придумав значні та вимірювані покращення продуктивності.
StaxMan

13

Додавання до інших відповідей, вже наведених вище. Якщо випадкова нечутливість має для вас будь-яке значення, тоді використовуйте Джексона. Gson не підтримує нечутливість до ключових імен, тоді як Джексон.

Ось два пов'язані посилання

(Ні) Підтримка чутливості до регістру в Gson: GSON: Як отримати нечутливий до регістру елемент від Json?

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


Фрагмент підтримки чутливості до випадків у Джексона не працює . А точніше, він працює лише для властивостей верхнього рівня. Спробуйте вкласти ресурс, і ви побачите, що рішення не працює.
Андрес Ф.

1
Насправді існує формальна підтримка нечутливих до регістру властивостей MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, додано у Джексоні 2.5. Тому для цього не потрібно додавати спеціальний код.
StaxMan

6

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


Якщо ви вже маєте примітки до своїх класів даних для сплячого режиму, ви все одно не хочете іншого набору для JAXB.
orbfish

1
Приємно мати можливість додати підтримку "іноземних" анотацій. Джексон має додатковий модуль анотації JAXB, а також модуль сплячки для пари своїх анотацій (для швидкоплинності, ледачого завантаження). Можливо, Gson може бути розширений, щоб дозволити і модульні розширення.
StaxMan

2
Тим більше, що JAXB - це стандарт!
maxxyme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.