Что такое 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