Как работать с JSON в Java?

«Как работать с JSON в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Работа с JSON в Java обычно осуществляется с помощью сторонних библиотек. Наиболее популярные — Jackson и Gson.

Библиотека Jackson (de facto стандарт)

Основной класс — ObjectMapper.

1. Сериализация объекта в JSON (Java Object → JSON String):

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        User user = new User("John", 30, "john@example.com");

        // Сериализация в строку
        String jsonString = mapper.writeValueAsString(user);
        System.out.println(jsonString);
        // Вывод: {"name":"John","age":30,"emailAddress":"john@example.com"}

        // Сериализация с красивым выводом
        String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println(prettyJson);
    }
}

// Модельный класс с аннотациями Jackson
class User {
    private String name;
    private int age;
    @JsonProperty("emailAddress") // Кастомное имя поля в JSON
    private String email;
    // Конструктор, геттеры, сеттеры...
}

2. Десериализация JSON в объект (JSON String → Java Object):

String jsonInput = "{"name":"Alice","age":25,"emailAddress":"alice@example.com"}";

User userObject = mapper.readValue(jsonInput, User.class);
System.out.println(userObject.getName()); // Alice

3. Работа со сложными структурами (коллекции, вложенные объекты):

// Список объектов
List<User> users = mapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});

// Map
Map<String, Integer> map = mapper.readValue("{"A":1,"B":2}", 
                                            new TypeReference<Map<String, Integer>>() {});

Ключевые возможности и аннотации Jackson:

  • @JsonProperty — задает имя поля в JSON.
  • @JsonIgnore — исключает поле из сериализации/десериализации.
  • @JsonFormat — управляет форматированием дат.
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private LocalDate birthDate;
  • @JsonInclude — управляет включением полей (например, только не-null значения).
    @JsonInclude(JsonInclude.Include.NON_NULL)

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

Более легковесная и простая в настройке библиотека.

import com.google.gson.Gson;

Gson gson = new Gson();
String json = gson.toJson(myObject); // Сериализация
MyClass obj = gson.fromJson(json, MyClass.class); // Десериализация

Выбор библиотеки:

  • Jackson: Более мощный, гибкий, считается стандартом в Spring и многих других фреймворках. Поддерживает streaming API, аннотации, разные форматы данных (XML, YAML).
  • Gson: Проще в использовании, меньше зависимостей, хорошо подходит для простых задач и Android-разработки.