JSON (Javascript Object Notation) – это набор пар ключ-значение, который может быть легко разобран и сгенерирован приложениями. Это подмножество стандарта языка программирования JavaScript ECMA-262. Разбор JSON обязателен в большинстве приложений, таких как restful API или приложения, которым нужна сериализация данных.
В экосистеме Java две самые популярные библиотеки для работы с данными JSON – это Jackson и Gson. Обе они широко используются и предлагают уникальные преимущества. В этой статье используются примеры крайних случаев для изучения особенностей обеих библиотек по различным параметрам.
Краткий обзор Jackson и Gson
Jackson
Jackson был разработан FasterXML и используется в корпоративных приложениях и фреймворках, таких как Spring Boot. Он предлагает разбор, сериализацию и десериализацию данных JSON. Следующие особенности делают эту библиотеку популярной среди разработчиков:
- Jackson является библиотекой обработки JSON по умолчанию в Spring Boot, что устраняет необходимость ручной настройки в большинстве случаев.
- Он упрощает десериализацию JSON в обобщенные типы с использованием TypeReference или JavaType.
- Он предоставляет различные аннотации для настройки поведения сериализации и десериализации. Например,
@JsonProperty(name)
обеспечивает безупречное сопоставление между входным ключом и фактическим полем Java POJO. - Он предоставляет обширную и надежную поддержку двунаправленного связывания данных (JSON к POJO и наоборот), потокового API (API читает JSON в POJO) и парсинга модели дерева (карта объектов JSON в памяти).
- Библиотека Jackson предлагает высокую производительность благодаря минимизации накладных расходов на память и оптимизации сериализации/десериализации (из JSON в POJO и наоборот).
- Jackson поддерживает дополнительные модули, такие как обработка XML, YAML и специфические улучшения для Kotlin и Scala.
- Аннотации, такие как
@JsonTypeInfo
и@JsonSubTypes
, обрабатывают полиморфные типы. - Она обрабатывает отсутствующие или дополнительные поля в данных JSON благодаря своей обратной и прямой совместимости.
- Jackson предоставляет поддержку для неизменяемых объектов и классов с конструкторами, включая те, которые используют паттерны проектирования “строитель”.
- Класс
ObjectMapper
является потокобезопасным и, следовательно, обеспечивает эффективное использование в многопоточных приложениях.
Gson
Gson был разработан Google и предназначен для преобразования JSON в объекты Java (POJO) и наоборот. Он прост и идеален для использования в небольших приложениях, которым нужны быстрые реализации. Открытая библиотека предлагает следующие ключевые функции:
- Gson имеет минимальные внешние зависимости, поэтому его легко интегрировать.
- Он поддерживает вложенные объекты и сложные типы данных, такие как списки, карты и пользовательские классы.
- Он может десериализовать JSON в обобщенные коллекции, такие как
List<T>
,Map<K,V>
с использованием TypeToken. - Интерфейсы JsonSerializer и JsonDeserializer библиотеки Gson позволяют выполнять настраиваемую реализацию.
- По умолчанию значения null исключаются из JSON-вывода, и при необходимости значения null могут быть включены в вывод.
- Аннотации
@SerializedName
сопоставляют ключи JSON с полями Java с разными именами. - Объекты Gson являются потокобезопасными и, следовательно, могут использоваться в многопоточных приложениях.
- Класс 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 ниже:
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
JSON-парсинг основного класса с использованием библиотеки Jackson:
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
Результат работы вышеуказанного класса выглядит следующим образом:
Реализация Gson
Зависимость Gson, используемая для преобразования вышеприведенного JSON в объект Java, представлена ниже:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
Парсинг JSON с использованием основного класса библиотеки GSON:
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
Результат работы вышеприведенного основного класса выглядит следующим образом:
Какой выбрать?
Jackson обеспечивает высокую производительность; поэтому его следует использовать в проектах с комплексными структурами данных или большими наборами данных, в то время как Gson следует использовать, когда есть небольшие наборы данных и структура данных проста.
Заключение
Обе библиотеки могут эффективно обрабатывать вышеприведенный набор данных и отлично справляются с разбором JSON в JAVA. Упомянутое сравнение помогает выбрать подходящую библиотеку в зависимости от требований проекта.
Упомянутые выше фрагменты кода доступны в репозитории GitHub.
Подробное сравнение между Jackson и Gson доступно на Baeldung. Официальная документация по Jackson предлагает подробную информацию о функциях и настройке Jackson. Аналогично, официальная документация по Gson предоставляет подробное руководство по реализации.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java