Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как преобразовать объект в JSON и обратно

Короткий ответ

В стандартной библиотеке Java нет JSON-парсера. Обычно используют библиотеку Jackson (её же использует Spring) или Gson от Google. Их подключают в pom.xml или build.gradle. С Jackson объект превращается в JSON одной строкой:

// src/main/java/shop/JsonDemo.java
package shop;
 
import com.fasterxml.jackson.databind.ObjectMapper;
 
public class JsonDemo {
    record User(String name, int age) {}
 
    public static void main(String[] args) throws Exception {
        var mapper = new ObjectMapper();
 
        String json = mapper.writeValueAsString(new User("Anna", 30));
        System.out.println(json); // {"name":"Anna","age":30}
    }
}

Jackson с версии 2.12 понимает записи без дополнительных настроек.

Из JSON в объект

readValue() создаёт объект нужного класса:

// src/main/java/shop/JsonDemo.java
User user = mapper.readValue("{\"name\":\"Oleg\",\"age\":25}", User.class);
System.out.println(user.name()); // Oleg

Список объектов

Из-за стирания типов список описывают через TypeReference:

// src/main/java/shop/JsonDemo.java
List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {});

Gson

У Gson похожий интерфейс:

// src/main/java/shop/GsonDemo.java
var gson = new Gson();
String json = gson.toJson(new User("Anna", 30));
User user = gson.fromJson(json, User.class);

Частая ошибка

Собирать JSON склейкой строк. Кавычки и переводы строк внутри значений ломают результат:

void main() {
    String name = "Anna \"The Great\"";
    IO.println("{\"name\":\"" + name + "\"}");
}

Результат:

{"name":"Anna "The Great""}

Такой JSON не разберёт ни один парсер. Библиотека экранирует спецсимволы сама.

Функции из этого ответа

  • record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().
  • String.formatted() — Подставляет значения в саму строку как в шаблон — короткая форма String.format().

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.