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

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

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

Начать курс

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

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

Мы рассмотрим реальные примеры кода, научимся обрабатывать вложенные структуры и разберем типичные ошибки. К концу статьи вы сможете уверенно работать с JSON в любом Java-проекте.

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

Jackson vs Gson: что выбрать?

На рынке Java существует несколько библиотек для работы с JSON, но две из них стали стандартом де-факто:

  • Jackson — более производительная и функциональная библиотека. Поддерживает аннотации, потоковую обработку и кастомные сериализаторы. Рекомендуется для enterprise-проектов.
  • Gson — простая и легковесная библиотека от Google. Идеально подходит для небольших проектов и быстрого прототипирования.

Для подключения любой из них достаточно добавить зависимость в pom.xml (Maven) или build.gradle (Gradle).

Подключение Jackson (Maven)

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

Подключение Gson (Maven)

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

2. Парсинг JSON: из строки в Java-объект

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

Создание модели данных

public class User {
    private String name;
    private int age;
    private String email;

    // Обязательно нужен пустой конструктор!
    public User() {}

    // Геттеры и сеттеры
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

Парсинг с помощью Jackson

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonParsingExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"Иван\",\"age\":30,\"email\":\"ivan@example.com\"}";
        
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        
        System.out.println("Имя: " + user.getName());
        System.out.println("Возраст: " + user.getAge());
    }
}

Парсинг с помощью Gson

import com.google.gson.Gson;

public class GsonParsingExample {
    public static void main(String[] args) {
        String json = "{\"name\":\"Мария\",\"age\":25,\"email\":\"maria@example.com\"}";
        
        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        
        System.out.println("Имя: " + user.getName());
        System.out.println("Email: " + user.getEmail());
    }
}

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

Сериализация — обратный процесс: мы берем Java-объект и преобразуем его в JSON-строку. Это необходимо, например, при отправке данных на сервер или записи в файл.

Сериализация с Jackson

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonSerializationExample {
    public static void main(String[] args) throws Exception {
        User user = new User();
        user.setName("Алексей");
        user.setAge(28);
        user.setEmail("alex@example.com");
        
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);
        
        System.out.println(json);
        // Вывод: {"name":"Алексей","age":28,"email":"alex@example.com"}
    }
}

Сериализация с Gson

import com.google.gson.Gson;

public class GsonSerializationExample {
    public static void main(String[] args) {
        User user = new User();
        user.setName("Елена");
        user.setAge(32);
        user.setEmail("elena@example.com");
        
        Gson gson = new Gson();
        String json = gson.toJson(user);
        
        System.out.println(json);
        // Вывод: {"name":"Елена","age":32,"email":"elena@example.com"}
    }
}

4. Работа с вложенными объектами и массивами

На практике JSON-данные редко бывают плоскими. Часто встречаются вложенные объекты и массивы. Рассмотрим, как с этим работать.

Пример сложной структуры

// Класс Address
public class Address {
    private String city;
    private String street;
    private int houseNumber;
    // геттеры/сеттеры...
}

// Класс User с вложенным адресом
public class UserWithAddress {
    private String name;
    private Address address;
    private List<String> phoneNumbers;
    // геттеры/сеттеры...
}

Парсинг вложенного JSON (Jackson)

String complexJson = "{\"name\":\"Дмитрий\",\"address\":{\"city\":\"Москва\",\"street\":\"Тверская\",\"houseNumber\":10},\"phoneNumbers\":[\"+7-999-123-45-67\",\"+7-495-765-43-21\"]}";

ObjectMapper mapper = new ObjectMapper();
UserWithAddress user = mapper.readValue(complexJson, UserWithAddress.class);

System.out.println("Город: " + user.getAddress().getCity());
System.out.println("Телефоны: " + user.getPhoneNumbers().get(0));

Обработка массивов JSON

// Парсинг массива пользователей
String jsonArray = "[{\"name\":\"Анна\",\"age\":22},{\"name\":\"Олег\",\"age\":35}]";

// Jackson
List<User> users = mapper.readValue(json                

Блоги

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