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

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

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

Начать курс

Что такое JSON и зачем он нужен в Java?

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

Работа с JSON в Java включает два основных действия:

  • Сериализация — преобразование Java-объекта в строку JSON.
  • Парсинг (десериализация) — преобразование строки JSON обратно в Java-объект.

В этом уроке мы разберем, как выполнять эти операции с помощью двух популярных библиотек: Jackson и Gson. Примеры подойдут даже для начинающих разработчиков.

Подготовка проекта и подключение библиотек

Для начала работы нам понадобится Java-проект. Мы будем использовать Maven для управления зависимостями. Создайте новый Maven-проект и добавьте следующие зависимости в файл pom.xml:

Добавление Jackson

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

Добавление Gson

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

Обе библиотеки можно использовать одновременно в одном проекте. После обновления Maven-зависимости будут загружены автоматически.

Создание Java-класса для примера

Для демонстрации создадим простой класс User, который будем сериализовать и парсить:

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

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

    public User(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Геттеры и сеттеры (обязательны для Jackson)
    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 это обязательно, для Gson — достаточно геттеров).

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

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

Пример с Jackson

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User("Анна", 25, "anna@example.com");

        // Сериализация в строку
        String json = mapper.writeValueAsString(user);
        System.out.println(json);
    }
}

Результат выполнения:

{"name":"Анна","age":25,"email":"anna@example.com"}

Пример с Gson

import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        Gson gson = new Gson();
        User user = new User("Анна", 25, "anna@example.com");

        // Сериализация в строку
        String json = gson.toJson(user);
        System.out.println(json);
    }
}

Результат будет идентичным. Обе библиотеки справляются с задачей одинаково хорошо для простых объектов.

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

Парсинг (десериализация) — обратный процесс: из строки JSON мы получаем объект Java.

Пример с Jackson

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonParseExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"name\":\"Иван\",\"age\":30,\"email\":\"ivan@example.com\"}";

        // Десериализация в объект User
        User user = mapper.readValue(json, User.class);

        System.out.println("Имя: " + user.getName());
        System.out.println("Возраст: " + user.getAge());
        System.out.println("Email: " + user.getEmail());
    }
}

Пример с Gson

import com.google.gson.Gson;

public class GsonParseExample {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String json = "{\"name\":\"Иван\",\"age\":30,\"email\":\"ivan@example.com\"}";

        // Десериализация в объект User
        User user = gson.fromJson(json, User.class);

        System.out.println("Имя: " + user.getName());
        System.out.println("Возраст: " + user.getAge());
        System.out.println("Email: " + user.getEmail());
    }
}

Обратите внимание: при парсинге поля в JSON должны совпадать с именами полей класса (или с аннотациями, которые мы рассмотрим позже).

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

JSON часто содержит вложенные структуры. Рассмотрим более сложный пример.

Создадим класс Department (отдел), который содержит список сотрудников:

import java.util.List;

public class Department {
    private String name;
    private List<User> employees;

    public Department() {}

    public Department(String name, List<User> employees) {
        this.name = name;
        this.employees = employees;
    }

    // Геттеры и сеттеры
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public List<User> getEmployees() { return employees; }
    public void setEmployees(List<User> employees) { this.employees = employees; }
}

Теперь сериализуем и десериализуем объект Department с помощью Jackson:

import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;

public class ComplexJsonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Создаем вложенный объект
        User user1 = new User("Ольга", 28, "olga@example.com                

Блоги

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