Работа с JSON в Java: парсинг и сериализация данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в работу с JSON в Java

JSON (JavaScript Object Notation) — это легковесный формат обмена данными, который широко используется в современных веб-приложениях, API и микросервисах. Несмотря на название, JSON не привязан к JavaScript и отлично поддерживается в Java. В этой статье мы подробно разберём, как выполнять парсинг, сериализацию и десериализацию JSON в Java с помощью популярных библиотек: Jackson и Gson.

Умение работать с JSON — обязательный навык для Java-разработчика. Будь то чтение конфигурационных файлов, взаимодействие с REST API или передача данных между микросервисами — JSON встречается повсюду. Мы рассмотрим оба подхода, чтобы вы могли выбрать наиболее подходящий для вашего проекта.

Основные библиотеки для работы с JSON в Java

В экосистеме Java существует несколько популярных библиотек для работы с JSON. Две из них являются стандартом де-факто:

  • Jackson — самая популярная библиотека, входящая в состав Spring Boot. Отличается высокой производительностью и широкими возможностями настройки.
  • Gson — библиотека от Google, простая в использовании и легковесная. Идеально подходит для небольших проектов.

Обе библиотеки поддерживают полный цикл работы с JSON: сериализацию (объект → JSON), десериализацию (JSON → объект) и потоковую обработку.

Подключение зависимостей

Для работы с библиотеками необходимо добавить их в проект. Если вы используете Maven, добавьте следующие зависимости в pom.xml:

<!-- Jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

<!-- Gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version>
</dependency>

Для Gradle добавьте строки в build.gradle:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
implementation 'com.google.code.gson:gson:2.10.1'

Сериализация Java-объектов в JSON

Сериализация — это процесс преобразования Java-объекта в строку JSON. Рассмотрим оба подхода.

Сериализация с помощью Jackson

Jackson использует класс ObjectMapper для сериализации. Пример:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

public class JacksonSerialization {
    public static void main(String[] args) throws JsonProcessingException {
        // Создаём объект для сериализации
        User user = new User("Иван", "ivan@example.com", 25);
        
        // Создаём ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        
        // Сериализуем в JSON
        String json = mapper.writeValueAsString(user);
        
        System.out.println(json);
        // Вывод: {"name":"Иван","email":"ivan@example.com","age":25}
    }
}

class User {
    private String name;
    private String email;
    private int age;
    
    // Конструктор, геттеры и сеттеры
    public User(String name, String email, int age) {
        this.name = name;
        this.email = email;
        this.age = age;
    }
    
    public String getName() { return name; }
    public String getEmail() { return email; }
    public int getAge() { return age; }
}

Сериализация с помощью Gson

Gson использует класс Gson с методом toJson():

import com.google.gson.Gson;

public class GsonSerialization {
    public static void main(String[] args) {
        User user = new User("Мария", "maria@example.com", 30);
        
        Gson gson = new Gson();
        String json = gson.toJson(user);
        
        System.out.println(json);
        // Вывод: {"name":"Мария","email":"maria@example.com","age":30}
    }
}

Оба примера дают одинаковый результат. Разница в том, что Jackson требует геттеры для всех полей, а Gson по умолчанию работает с любыми полями (даже приватными).

Парсинг JSON (десериализация) в Java-объекты

Десериализация — обратный процесс: преобразование JSON-строки в Java-объект.

Десериализация с помощью Jackson

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;

public class JacksonDeserialization {
    public static void main(String[] args) throws JsonProcessingException {
        String json = "{\"name\":\"Пётр\",\"email\":\"peter@example.com\",\"age\":28}";
        
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        
        System.out.println(user.getName());  // Пётр
        System.out.println(user.getEmail()); // peter@example.com
        System.out.println(user.getAge());   // 28
    }
}

Десериализация с помощью Gson

import com.google.gson.Gson;

public class GsonDeserialization {
    public static void main(String[] args) {
        String json = "{\"name\":\"Анна\",\"email\":\"anna@example.com\",\"age\":22}";
        
        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        
        System.out.println(user.getName());  // Анна
        System.out.println(user.getEmail()); // anna@example.com
        System.out.println(user.getAge());   // 22
    }
}

Обратите внимание: для успешной десериализации класс User должен иметь конструктор без параметров (в Jackson это обязательно, в Gson — желательно).

Работа со сложными структурами JSON

Часто JSON содержит вложенные объекты и массивы. Рассмотрим, как обрабатывать такие структуры.

Пример: JSON с массивом и вложенными объектами

// JSON-строка
String complexJson = """
{
    "company": "TechCorp",
    "employees": [
        {"name": "Иван", "position": "Developer", "skills": ["Java", "SQL"]},
        {"name": "Мария", "position": "Manager", "skills": ["Leadership", "Agile"]}
    ]
}
""";

Модели данных для сложного JSON

import java.util.List;

class Company {
    private String company;
    private List<Employee> employees;
    
    // Конструкторы, геттеры, сеттеры
    public Company() {}
    
    public String get                

Блоги

Рекомендаций по книгам