JSON в класс Java
Вставьте образец JSON, и генератор выдаст один или несколько классов Java с правильными типами полей, геттерами, сеттерами и аннотациями JSON-библиотеки. Для более чистого кода поддерживаются Jackson (@JsonProperty), Gson (@SerializedName) и Lombok (@Data/@Builder). Вложенные объекты становятся внутренними или соседними классами в зависимости от выбранной компоновки.
Как преобразовать JSON в Java
-
1
Вставьте JSON
Достаточно одного образца; несколько образцов улучшают определение того, может ли поле быть null.
-
2
Выберите библиотеку
Jackson (самый распространённый в Spring), Gson (для Android и некоторых устаревших проектов) или простой POJO без аннотаций.
-
3
Выберите дополнительные опции
Lombok, для автогенерации геттеров/сеттеров, паттерна builder, equals/hashCode. Либо оставьте код без них.
-
4
Выберите стиль вложенности
Соседние классы в одном файле (public-классы в Java 17+ должны быть в отдельных файлах) или вложенные статические классы.
-
5
Скопируйте код
Вставьте его в свой проект. Имена классов совпадают с ключами JSON, а пакет задаётся согласно вашей настройке.
Пример вывода: Jackson + Lombok
Ввод:
{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }
Вывод:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
@JsonProperty("firstName")
private String firstName;
@JsonProperty("age")
private int age;
@JsonProperty("address")
private Address address;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
@JsonProperty("city")
private String city;
}
Сопоставление типов
| JSON | Тип в Java |
|---|---|
| строка | String |
| целое число (≤ Integer.MAX) | Integer / int |
| большое целое число | Long / BigInteger |
| десятичное число | Double / BigDecimal |
| логическое значение | Boolean / boolean |
| дата ISO | LocalDate (Jackson JSR-310) |
| дата и время ISO | Instant / OffsetDateTime |
| null (при наличии соседнего не-null поля) | Обёрточный тип (например, Integer) |
| массив | List<T> |
| объект | вложенный класс |
Выбор между обёрточным и примитивным типом
- Примитивный тип (
int,long,boolean), не может быть null, эффективен, без автоупаковки. - Обёрточный тип (
Integer,Long,Boolean), допускает null; необходим, если поле может отсутствовать или быть null в JSON.
По умолчанию генератор использует обёрточный тип для всего, что считается допускающим null, и примитивный, в остальных случаях.
Jackson и Gson
| Возможность | Jackson | Gson |
|---|---|---|
| Распространённость в Spring | Да, по умолчанию | Нет (нужна настройка) |
| Производительность | Быстрее | Медленнее |
| Поддержка дат JSR-310 | Через отдельный модуль | Через отдельный модуль |
| Полиморфизм | @JsonTypeInfo |
RuntimeTypeAdapter |
| Терпимость к висячей запятой | Нет (по умолчанию) | Да |
Частые ошибки
- Использование примитивных типов для полей, допускающих null.
intне может быть null; Jackson выбросит ошибку, если в JSON окажется"age": null. ИспользуйтеInteger. - Отсутствие модулей для дат. Jackson требует
jackson-datatype-jsr310дляInstant/LocalDate. Без него даты откатываются кStringили к значениям long в формате epoch. - Совместное использование обёрточных типов в несвязанных классах. Если в двух JSON-структурах есть вложенный
Address, генератор создаст два классаAddress. Переименуйте или объедините их вручную. - Забытый
@JsonIgnoreProperties(ignoreUnknown = true). Строгий Jackson выбрасывает ошибку на неизвестных свойствах; добавьте эту аннотацию (или настройте её глобально) для терпимой десериализации.
Часто задаваемые вопросы
В большинстве случаев Jackson, это стандарт в Spring, он быстрее и имеет более богатую поддержку полиморфизма. Gson легче и лучше известен в мире Android, хотя Android-проекты всё чаще используют Moshi или kotlinx.serialization.
Lombok убирает много шаблонного кода (геттеры, сеттеры, equals, hashCode, builder). Он широко распространён, но требует наличия процессора аннотаций Lombok в сборке. Отключите его, если ваш проект избегает Lombok из соображений чистоты зависимостей.
Поля, оказавшиеся null хотя бы в одном из наблюдаемых образцов, становятся обёрточными типами (Integer вместо int), чтобы могли хранить null. После этого Jackson без ошибок десериализует "age": null. Добавьте @JsonInclude(Include.NON_NULL), чтобы пропускать null при сериализации.
Да, если выбрать «record». Записи (record) лаконичны, неизменяемы и работают с Jackson 2.12+. Для проектов на Spring Boot 3 сочетание record и генерации без Lombok, современный выбор.
Сопутствующие инструменты
Смешивание цветов
Смешайте два HEX-цвета в 2-20 равномерных образцов. Каждый промежуточный цвет показывается как HEX-код в верхнем регистре, включая оба края.
Генератор вымышленных телефонных номеров
Создавайте до 50 вымышленных номеров из официально зарезервированных диапазонов пяти стран.
Генератор конфигурации webpack
Создайте webpack.config.js для webpack 5 по короткой форме: задайте entry, папку вывода и режим, затем включите TypeScript, Babel, загрузчик CSS, HtmlWebpackPlugin и сервер разработки.
Генератор бейджей README
Создавайте бейджи shields.io для файлов README на GitHub: статус сборки, версия, лицензия, число загрузок и покрытие кода. Просмотрите и скопируйте фрагмент Markdown.
Генератор случайных букв
Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.
Генератор случайных адресов
Создавайте 1–20 похожих на адрес записей для макетов и тестов в трёх упрощённых форматах.
Инструмент доступен на других языках
- JSON ke Kelas Java [ID]
- JSON から Java クラスへ [JA]
- JSON till Java-klass [SV]
- JSON을 Java 클래스로 [KO]
- JSON เป็นคลาส Java [TH]
- JSON na klasę Java [PL]
- JSON zu Java-Klasse [DE]
- JSON sang lớp Java [VI]
- JSON para Classe Java [PT]
- JSON a Clase Java [ES]
- JSON إلى فئة Java [AR]
- JSON naar Java-klasse [NL]
- JSON vers classe Java [FR]
- JSON to Java Class [EN]
- JSON in classe Java [IT]
- JSON'dan Java Sınıfına [TR]
- JSON 转 Java 类 [ZH]