Jackson против Gson: крайние случаи при разборе JSON для приложений на Java

JSON (Javascript Object Notation) – это набор пар ключ-значение, который может быть легко разобран и сгенерирован приложениями. Это подмножество стандарта языка программирования JavaScript ECMA-262. Разбор JSON обязателен в большинстве приложений, таких как restful API или приложения, которым нужна сериализация данных.

В экосистеме Java две самые популярные библиотеки для работы с данными JSON – это Jackson и Gson. Обе они широко используются и предлагают уникальные преимущества. В этой статье используются примеры крайних случаев для изучения особенностей обеих библиотек по различным параметрам.

Краткий обзор Jackson и Gson

Jackson

Jackson был разработан FasterXML и используется в корпоративных приложениях и фреймворках, таких как Spring Boot. Он предлагает разбор, сериализацию и десериализацию данных JSON. Следующие особенности делают эту библиотеку популярной среди разработчиков:

  1. Jackson является библиотекой обработки JSON по умолчанию в Spring Boot, что устраняет необходимость ручной настройки в большинстве случаев.
  2. Он упрощает десериализацию JSON в обобщенные типы с использованием TypeReference или JavaType.
  3. Он предоставляет различные аннотации для настройки поведения сериализации и десериализации. Например, @JsonProperty(name) обеспечивает безупречное сопоставление между входным ключом и фактическим полем Java POJO.
  4. Он предоставляет обширную и надежную поддержку двунаправленного связывания данных (JSON к POJO и наоборот), потокового API (API читает JSON в POJO) и парсинга модели дерева (карта объектов JSON в памяти).
  5. Библиотека Jackson предлагает высокую производительность благодаря минимизации накладных расходов на память и оптимизации сериализации/десериализации (из JSON в POJO и наоборот).
  6. Jackson поддерживает дополнительные модули, такие как обработка XML, YAML и специфические улучшения для Kotlin и Scala.
  7. Аннотации, такие как @JsonTypeInfo и @JsonSubTypes, обрабатывают полиморфные типы.
  8. Она обрабатывает отсутствующие или дополнительные поля в данных JSON благодаря своей обратной и прямой совместимости.
  9. Jackson предоставляет поддержку для неизменяемых объектов и классов с конструкторами, включая те, которые используют паттерны проектирования “строитель”.
  10. Класс ObjectMapper является потокобезопасным и, следовательно, обеспечивает эффективное использование в многопоточных приложениях.

Gson

Gson был разработан Google и предназначен для преобразования JSON в объекты Java (POJO) и наоборот. Он прост и идеален для использования в небольших приложениях, которым нужны быстрые реализации. Открытая библиотека предлагает следующие ключевые функции:

  1. Gson имеет минимальные внешние зависимости, поэтому его легко интегрировать.
  2. Он поддерживает вложенные объекты и сложные типы данных, такие как списки, карты и пользовательские классы.
  3. Он может десериализовать JSON в обобщенные коллекции, такие как List<T>, Map<K,V> с использованием TypeToken.
  4. Интерфейсы JsonSerializer и JsonDeserializer библиотеки Gson позволяют выполнять настраиваемую реализацию.
  5. По умолчанию значения null исключаются из JSON-вывода, и при необходимости значения null могут быть включены в вывод.
  6. Аннотации @SerializedName сопоставляют ключи JSON с полями Java с разными именами.
  7. Объекты Gson являются потокобезопасными и, следовательно, могут использоваться в многопоточных приложениях.
  8. Класс GsonBuilder может применять пользовательские политики именования для полей. Например, FieldNamingPolicy.IDENTITY является политикой по умолчанию, что означает, что имя поля остается неизменным.

Учитываемые крайние случаи в этом сравнении

Feature Jackson GSON

Дополнительные поля

Игнорируются по умолчанию, настраиваемые.

Игнорируются по умолчанию.

Значения null

Поддерживает @JsonInclude.

Требуется .serializeNulls().

Циклические ссылки

Поддерживается с использованием @JsonIdentityInfo.

Не поддерживается непосредственно.

Обработка данных

Поддерживает Java 8 Date API с модулями.

Требует настраиваемых адаптеров типов.

Полиморфизм

Встроенный с @JsonTypeInfo.

Требует настраиваемой логики десериализации.

Входной JSON, рассматриваемый для сравнения с библиотеками Jackson и Gson, присутствует на GitHub.

Представление класса модели JSON находится на GitHub.

Реализация Jackson

Вышеуказанный JSON конвертируется в объект Java с использованием библиотек Jackson ниже:

XML

 

JSON-парсинг основного класса с использованием библиотеки Jackson:

Java

 

Результат работы вышеуказанного класса выглядит следующим образом:

Реализация Gson

Зависимость Gson, используемая для преобразования вышеприведенного JSON в объект Java, представлена ниже:

XML

 

Парсинг JSON с использованием основного класса библиотеки GSON:

Java

 

Результат работы вышеприведенного основного класса выглядит следующим образом:

Какой выбрать?

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

Заключение

Обе библиотеки могут эффективно обрабатывать вышеприведенный набор данных и отлично справляются с разбором JSON в JAVA. Упомянутое сравнение помогает выбрать подходящую библиотеку в зависимости от требований проекта.

Упомянутые выше фрагменты кода доступны в репозитории GitHub.

Подробное сравнение между Jackson и Gson доступно на Baeldung. Официальная документация по Jackson предлагает подробную информацию о функциях и настройке Jackson. Аналогично, официальная документация по Gson предоставляет подробное руководство по реализации.

Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java