Avatar ·

Как правильно парсить JSON в Java: подробное руководство для начинающих

Всем привет! Я только начал изучать Java и столкнулся с проблемой парсинга JSON. У меня есть приложение, которое получает данные от API в формате JSON, и мне нужно извлечь из них информацию. Я пробовал написать свой парсер вручную, но это оказалось очень сложно и ненадёжно. Вот пример JSON, который я получаю: ```json { "name": "John", "age": 30, "address": { "city": "New York", "zip": "10001" }, "hobbies": ["reading", "gaming", "hiking"] } ``` Я пытался сделать что-то вроде: ```java String json = "..."; String name = json.substring(json.indexOf("name") + 7, json.indexOf("\"", json.indexOf("name") + 7)); ``` Но это очень хрупкий код, и он ломается при любом изменении формата. Я слышал про библиотеки для работы с JSON, но не знаю, какую выбрать и как правильно их использовать. Подскажите, пожалуйста, какая библиотека лучше всего подходит для Java (я использую Java 11) и как правильно парсить JSON? Мне нужно не только читать данные, но и создавать JSON для отправки на сервер. Буду благодарен за примеры кода! <<>>

Лучший способ: Jackson — стандарт де-факто для работы с JSON в Java

Jackson — это мощная, быстрая и широко используемая библиотека для работы с JSON в Java. Она поддерживает все необходимые операции: парсинг, сериализацию (преобразование объектов в JSON) и десериализацию (JSON в объекты).

Установка Jackson

Если вы используете Maven, добавьте в pom.xml:

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

Для Gradle:

implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'

Способ 1: Парсинг в Map (простой и быстрый)

Если вам не нужно создавать отдельный класс для данных, используйте ObjectMapper:

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

public class JsonParserExample {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":\"10001\"},\"hobbies\":[\"reading\",\"gaming\",\"hiking\"]}";
        
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map = mapper.readValue(json, Map.class);
        
        // Извлекаем данные
        String name = (String) map.get("name");
        int age = (int) map.get("age");
        Map<String, Object> address = (Map<String, Object>) map.get("address");
        String city = (String) address.get("city");
        System.out.println("Name: " + name + ", Age: " + age + ", City: " + city);
    }
}

Способ 2: Создание класса-модели (рекомендуемый)

Создайте POJO (Plain Old Java Object) для ваших данных:

import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

public class Person {
    private String name;
    private int age;
    private Address address;
    private List<String> hobbies;

    // Геттеры и сеттеры обязательны
    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 Address getAddress() { return address; }
    public void setAddress(Address address) { this.address = address; }
    
    public List<String> getHobbies() { return hobbies; }
    public void setHobbies(List<String> hobbies) { this.hobbies = hobbies; }
}

class Address {
    private String city;
    private String zip;
    
    public String getCity() { return city; }
    public void setCity(String city) { this.city = city; }
    public String getZip() { return zip; }
    public void setZip(String zip) { this.zip = zip; }
}

Теперь парсинг становится тривиальным:

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"city\":\"New York\",\"zip\":\"10001\"},\"hobbies\":[\"reading\",\"gaming\",\"hiking\"]}";
        
        ObjectMapper mapper = new ObjectMapper();
        Person person = mapper.readValue(json, Person.class);
        
        System.out.println(person.getName()); // John
        System.out.println(person.getAddress().getCity()); // New York
    }
}

Создание JSON из объекта

Person person = new Person();
person.setName("Alice");
person.setAge(25);
// ... заполняем остальные поля

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(person);
System.out.println(json); // {"name":"Alice","age":25,...}

Важные советы:

  • Всегда используйте try-catch или throws для JsonProcessingException
  • Для работы с датами используйте аннотацию @JsonFormat
  • Если ключи JSON отличаются от полей Java, используйте @JsonProperty("json_key_name")
  • Для неизвестных полей добавьте @JsonIgnoreProperties(ignoreUnknown = true) в класс

Jackson автоматически обрабатывает вложенные объекты, массивы, числа, строки и null-значения. Это гораздо надёжнее, чем ручной парсинг!

<<>>

Альтернатива: Gson от Google

Gson — ещё одна популярная библиотека, которая особенно хороша для простых случаев. Она проще в использовании, но чуть менее гибкая, чем Jackson.

Установка Gson

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

Пример использования

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class GsonExample {
    public static void main(String[] args) {
        String json = "{\"name\":\"John\",\"age\":30}";
        
        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        
        System.out.println(person.getName()); // John
        
        // Создание JSON
        String outputJson = gson.toJson(person);
        System.out.println(outputJson);
        
        // "Pretty printing" — читаемый вывод
        Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
        String prettyJson = prettyGson.toJson(person);
        System.out.println(prettyJson);
    }
}

Когда выбрать Gson вместо Jackson?

  • Если вам нужна минимальная конфигурация
  • Для небольших проектов без сложной вложенности
  • Когда важна простота кода, а не максимальная производительность

Обе библиотеки отлично справляются с задачей. Jackson считается более мощным и производительным, Gson — более простым. Для учебных проектов подойдёт любая из них.