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