Как преобразовать объект в 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().