Библиотека Java Jackson

Java 常用类库Общие библиотеки Java


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 в качестве примера):
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.0</version>
</dependency>

Простой пример преобразования между объектами Java и JSON:

Пример

import com.fasterxml.jackson.databind.ObjectMapper;

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)

Простой пример

Пример

public class Person {
    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}

Форматированный вывод

Пример

String prettyJson = mapper.writerWithDefaultPrettyPrinter()
                         .writeValueAsString(person);
System.out.println(prettyJson);
/*
Вывод:
{
"name" : "Чжан Сань",
  "age" : 25
}
*/


Десериализация JSON (JSON → объект)

Простой пример

Пример

String json = "{\"name\":\"Li Si\",\"age\":30}";
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;

Обработка сложных типов

Типы коллекций

Пример

List people = Arrays.asList(
    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

Пример

Map<String, Object> data = new HashMap<>();
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:

Пример

JsonNode rootNode = mapper.readTree(json);
String name = rootNode.get("name").asText();
int age = rootNode.get("age").asInt();

Лучшие практики

  1. Повторно используйте ObjectMapper: СозданиеObjectMapperЭкземпляры дорого создавать; один и тот же экземпляр следует повторно использовать
  2. Обрабатывайте исключения: Всегда обрабатывайтеJsonProcessingExceptionиIOException
  3. Используйте паттерн DTO: Не сериализуйте доменные модели напрямую; используйте специальные объекты передачи данных (DTO)
  4. Учитывайте производительность: В высокопроизводительных сценариях можно использоватьJsonFactoryдля низкоуровневых операций

Итог

Jackson — мощный инструмент для работы с JSON в Java, предоставляющий:

  • Простой и удобный API
  • Возможность высокопроизводительной обработки JSON
  • Широкие возможности настройки
  • Хорошая поддержка сообщества

Освоение Jackson может значительно повысить эффективность и гибкость работы с JSON-данными в Java-разработке.

Java 常用类库Общие библиотеки Java

Другие расширения