Парсинг JSON в Java: с нуля до работающего кода
Вы когда-нибудь смотрели на JSON-ответ от API и чувствовали лёгкую панику? «Как мне вытащить отсюда name? А что делать с этим вложенным объектом?» — знакомые вопросы, правда? Не переживайте, вы не одиноки. Тема «How to parse JSON in Java» — один из самых популярных запросов на Stack Overflow, и сегодня мы раз и навсегда закроем этот вопрос.
JSON (JavaScript Object Notation) — это стандартный формат обмена данными. Практически каждый современный сервис — от погоды до биржевых котировок — отдаёт данные в JSON. Умение грамотно его парсить — базовый скилл Java-разработчика. Мы не будем читать скучные спецификации. Вместо этого возьмём три самые популярные библиотеки: Gson (Google), Jackson (FasterXML) и классический org.json. Вы увидите разницу подходов и сможете выбрать свой инструмент.
Что вы получите после прочтения? Вы сможете спарсить любой JSON — от простой строки до сложной вложенной структуры с массивами. Поехали!
Подготовка: что нам понадобится
Для примеров мы будем использовать простой Maven-проект. Если вы не используете Maven — не беда, просто скачайте JAR-файлы библиотек вручную. Вот минимальные зависимости для pom.xml:
<!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
<!-- org.json (простая) -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20231013</version>
</dependency>
Теперь представим, что мы получили от сервера такой JSON (информация о пользователе):
{
"id": 42,
"name": "Алиса",
"email": "alice@example.com",
"isActive": true,
"address": {
"city": "Москва",
"street": "Тверская"
},
"hobbies": ["чтение", "программирование", "велосипед"]
}
Наша задача — превратить эту строку в Java-объекты и вытащить нужные поля. Поехали по порядку.
Метод 1: Парсинг JSON в Java с помощью Gson (просто и элегантно)
Gson от Google — это, пожалуй, самый простой способ парсить JSON в Java. Его главное преимущество — минимализм. Вам не нужно писать много кода.
Шаг 1. Создаём Java-класс (POJO), который соответствует структуре JSON.
public class User {
private int id;
private String name;
private String email;
private boolean isActive;
private Address address;
private List<String> hobbies;
// Геттеры и сеттеры (обязательны для Gson!)
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
// ... остальные геттеры/сеттеры аналогично
}
public class Address {
private String city;
private String street;
// геттеры/сеттеры
}
Шаг 2. Парсим JSON одной строкой.
import com.google.gson.Gson;
public class GsonExample {
public static void main(String[] args) {
String json = "{\"id\":42,\"name\":\"Алиса\",\"email\":\"alice@example.com\",\"isActive\":true,\"address\":{\"city\":\"Москва\",\"street\":\"Тверская\"},\"hobbies\":[\"чтение\",\"программирование\",\"велосипед\"]}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println("Имя: " + user.getName());
System.out.println("Город: " + user.getAddress().getCity());
System.out.println("Первое хобби: " + user.getHobbies().get(0));
}
}
Вывод:
Имя: Алиса
Город: Москва
Первое хобби: чтение
Почему это круто? Gson автоматически маппит поля JSON на поля Java-класса. Если имена полей в JSON отличаются от Java (например, is_active вместо isActive), используйте аннотацию @SerializedName("is_active").
Когда использовать Gson? Когда вам нужен быстрый результат без настройки. Идеально для простых проектов и прототипов.
Метод 2: Парсинг JSON в Java с помощью Jackson (гибкость и скорость)
Jackson — это «тяжёлая артиллерия» в мире Java JSON. Он быстрее Gson и предлагает гораздо больше возможностей: кастомные десериализаторы, работа с деревьями (Tree Model) и потоковый парсинг.
Шаг 1. Тот же POJO-класс User (только геттеры/сеттеры обязательны).
Шаг 2. Используем ObjectMapper.
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonExample {
public static void main(String[] args) throws Exception {
String json = "{\"id\":42,\"name\":\"Алиса\",\"email\":\"alice@example.com\",\"isActive\":true,\"address\":{\"city\":\"Москва\",\"street\":\"Тверская\"},\"hobbies\":[\"чтение\",\"программирование\",\"велосипед\"]}";
ObjectMapper mapper = new ObjectMapper();
User user = mapper.readValue(json, User.class);
System.out.println("Email: " + user.getEmail());
System.out.println("Активен: " + user.isActive());
}
}
Важный момент: Если у вас в JSON есть неизвестные поля, Jackson выбросит исключение. Чтобы этого избежать, настройте ObjectMapper:
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Парсинг без POJO (Tree Model). Иногда лень создавать класс. Jackson позволяет работать с JSON как с деревом узлов:
JsonNode root = mapper.readTree(json);
String name = root.get("name").asText();
String city = root.get("address").get("city").asText();
System.out.println(name + " из города " + city);
Когда использовать Jackson? В больших проектах, где важна производительность, или когда нужно гибко обрабатывать динамические JSON-структуры.
Метод 3: Парсинг JSON в Java с помощью org.json (ручной контроль)
Библиотека org.json — это «дедушка» среди JSON-парсеров. Она не маппит данные на класс