Как работать с JSON в 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-разработки.

Ответ 18+ 🔞

А, JSON в Java, ну это классика, блядь! Все эти ваши REST API, конфиги, обмен данными — везде этот самый JSON торчит, как шило в жопе. И работать с ним голыми руками — это ж себе мозги выебать, ну нахуй. К счастью, есть библиотеки, которые всю эту муть на себя берут.

Вот смотри, есть два главных пацана на районе: Jackson и Gson. Jackson — это как солидный, блядь, авторитет, де-факто стандарт, особенно в Spring'овских бандах. А Gson — это такой шустрый парень от Google, попроще, но тоже дело знает.

Jackson — ёбаный король ситуации

Основной его инструмент — ObjectMapper. Эта твоя волшебная палочка, которая превращает Java-объекты в JSON-строку и обратно. Пиздец как удобно.

1. Объект → JSON (Сериализация) Вот смотри, как просто, ёпта:

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("Васян", 30, "vasya@banya.ru");

        // Превращаем объект в строку — раз, и готово
        String jsonString = mapper.writeValueAsString(user);
        System.out.println(jsonString);
        // Напечатает: {"name":"Васян","age":30,"emailAddress":"vasya@banya.ru"}

        // А можно ещё и красиво, с отступами, для читабельности
        String prettyJson = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println(prettyJson); // Красота, блядь!
    }
}

// А это наш класс-моделька
class User {
    private String name;
    private int age;
    @JsonProperty("emailAddress") // Смотри, какая хитрая жопа! В JSON поле будет называться не 'email', а 'emailAddress'
    private String email;
    // Ну и дальше конструктор, геттеры-сеттеры... сам допишешь, не маленький
}

2. JSON → Объект (Десериализация) А вот обратный фокус — из строки живой объект достаём:

String jsonInput = "{"name":"Алиса","age":25,"emailAddress":"alice@wonder.land"}";

User userObject = mapper.readValue(jsonInput, User.class);
System.out.println(userObject.getName()); // Выведет: Алиса

Вот и вся магия, блядь. Не нужно самому парсить, строки резать — ObjectMapper всё за тебя сделает, только класс правильно опиши.

3. А если структуры посложнее? А хуй там! Списки, мапы, вложенные объекты — всё переварит.

// Допустим, прилетел JSON с массивом пользователей
List<User> users = mapper.readValue(jsonArrayString, new TypeReference<List<User>>() {});

// Или вот, простой Map пришёл
Map<String, Integer> map = mapper.readValue("{"Яблоки":100,"Груши":200}", 
                                            new TypeReference<Map<String, Integer>>() {});

Фишки и аннотации Jackson

Чтобы совсем уж тонко управлять процессом, есть куча аннотаций. Вот основные, чтоб не облажаться:

  • @JsonProperty("имя_в_json") — как в примере выше. Говоришь библиотеке: «Слышь, поле email у меня, но в JSON'е пусть будет emailAddress, я так хочу!».
  • @JsonIgnore — эта штука просто вычёркивает поле нахуй. Ни в JSON его не отправит, ни из JSON не прочитает. Секретные пароли, всякая служебная хуйня — идеально.
  • @JsonFormat — для дат, блядь, спасение. А то они сами по себе выглядят, как попало.
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private LocalDate birthDate; // Теперь будет "31-12-1999", а не какая-то дичь
  • @JsonInclude(JsonInclude.Include.NON_NULL) — вешаешь на класс и говоришь: «Не пиши в JSON поля, которые равны null». Чистота, порядок, ебать!

Gson — лёгкая артиллерия

А это библиотечка от Гугла. Попроще, побыстрее в освоении. Если проект не огромный и не требует всех этих Jackson'овских извращений — Gson может быть в самый раз.

import com.google.gson.Gson;

Gson gson = new Gson(); // Создал — и всё, готов к работе
String json = gson.toJson(myObject); // Объект в строку
MyClass obj = gson.fromJson(json, MyClass.class); // Строку обратно в объект

Вот и весь разговор. Никаких тебе сложных конфигураций по умолчанию.

Так что же выбрать, ёпта?

  • Jackson: Если ты в большом, серьёзном проекте (особенно на Spring), нужна хитровыебанная настройка, работа с XML/YAML или максимальная производительность. Это твой тяжёлый, блядь, инструмент.
  • Gson: Для быстрых скриптов, простых задач, Android-разработки или когда овердохуища зависимостей от Jackson'а не хочется. Просто взял и сделал.

В общем, суть в чём: не изобретай велосипед, не парсь JSON вручную, это путь в никуда. Бери библиотеку, настраивай под себя — и живи спокойно, блядь.