Введение в работу с 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