Библиотека Java Jackson
Jackson — это высокопроизводительная библиотека обработки JSON для Java, которая может:
- Сериализовать объекты Java в формат JSON (Object → JSON)
- Десериализовать JSON в объекты Java (JSON → Object)
Jackson стал одной из самых популярных библиотек обработки JSON в экосистеме Java благодаря своей скорости, мощности и простоте использования.
Основные модули Jackson
- 1. Jackson Core: основной модуль Jackson, предоставляющий базовые возможности парсинга и генерации JSON.
- 2. Jackson Annotations: содержит различные аннотации, используемые для управления процессом сериализации и десериализации.
- 3. Jackson Databind: предоставляет функциональность привязки данных, обеспечивая преобразование между объектами Java и JSON.
Базовое использование
Добавление зависимости
Сначала вам нужно добавить зависимость Jackson в ваш проект (используя Maven в качестве примера):<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0</version>
</dependency>
Простой пример преобразования между объектами Java и JSON:
Пример
public class JacksonDemo {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
// Java-объект в JSON
Person person = new Person("Zhang San", 30);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// JSON в Java-объект
Person parsedPerson = mapper.readValue(json, Person.class);
System.out.println(parsedPerson);
}
}
class Person {
private String name;
private int age;
// Должен иметь конструктор без аргументов
public Person() {}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Должен иметь геттеры и сеттеры
// Опустить геттеры/сеттеры и метод toString
}
Создание ObjectMapper
ObjectMapperЯвляется основным классом Jackson, ответственным за сериализацию и десериализацию:
ObjectMapper mapper = new ObjectMapper();
Сериализация JSON (Object → JSON)
Простой пример
Пример
private String name;
private int age;
// Опустить конструктор, геттеры и сеттеры
}
Person person = new Person("Zhang San", 25);
String json = mapper.writeValueAsString(person);
System.out.println(json);
// Вывод: {"name":"Zhang San","age":25}
Форматированный вывод
Пример
.writeValueAsString(person);
System.out.println(prettyJson);
/*
Вывод:
{
"name" : "Чжан Сань",
"age" : 25
}
*/
Десериализация JSON (JSON → объект)
Простой пример
Пример
Person person = mapper.readValue(json, Person.class);
System.out.println(person.getName()); // Вывод: Ли Сы
Чтение из файла
Person person = mapper.readValue(new File("person.json"), Person.class);
Общие аннотации
Jackson предоставляет различные аннотации для управления процессом сериализации и десериализации:
@JsonProperty
Укажите имя свойства JSON:
@JsonProperty("user_name")
private String name;
@JsonIgnore
Игнорировать определённое поле:
@JsonIgnore private String password;
@JsonFormat
Форматирование дат:
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private Date birthDate;
Обработка сложных типов
Типы коллекций
Пример
new Person("Wang Wu", 28),
new Person("Zhao Liu", 32)
);
String json = mapper.writeValueAsString(people);
// Вывод: [{"name":"Wang Wu","age":28},{"name":"Zhao Liu","age":32}]
Тип Map
Пример
data.put("name", "Zhang San");
data.put("age", 25);
data.put("isStudent", true);
String json = mapper.writeValueAsString(data);
// Вывод: {"name":"Zhang San","age":25,"isTrue":true}
Расширенные функции
Пользовательская сериализация/десериализация
Путём наследованияJsonSerializerиJsonDeserializerМожно реализовать пользовательскую логику сериализации и десериализации.
Полиморфный тип
Используйте@JsonTypeInfoи@JsonSubTypesАннотации для обработки наследования и полиморфизма.
Дерево
Jackson предоставляет API древовидной модели, позволяющий напрямую манипулировать узлами JSON:
Пример
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();
Лучшие практики
- Повторно используйте ObjectMapper: Создание
ObjectMapperЭкземпляры дорого создавать; один и тот же экземпляр следует повторно использовать - Обрабатывайте исключения: Всегда обрабатывайте
JsonProcessingExceptionиIOException - Используйте паттерн DTO: Не сериализуйте доменные модели напрямую; используйте специальные объекты передачи данных (DTO)
- Учитывайте производительность: В высокопроизводительных сценариях можно использовать
JsonFactoryдля низкоуровневых операций
Итог
Jackson — мощный инструмент для работы с JSON в Java, предоставляющий:
- Простой и удобный API
- Возможность высокопроизводительной обработки JSON
- Широкие возможности настройки
- Хорошая поддержка сообщества
Освоение Jackson может значительно повысить эффективность и гибкость работы с JSON-данными в Java-разработке.
Другие расширения
Общие библиотеки Java