Генератор классов Java из JSON
Вставьте ответ API в JSON и получите типы Java в одном файле. Выберите классические классы с приватными полями, геттерами и сеттерами или компактные record (Java 16+). Ключи, которые не подходят как имена в camelCase, получают @JsonProperty из Jackson, и соответствие остаётся точным.
Работает в браузере: всё, что вы вводите, никуда не отправляется.
Как пользоваться
- Вставьте пример JSON. Лучший результат дают массивы с несколькими объектами: так находятся ключи, которых нет в части элементов.
- Выберите классы (поля, геттеры и сеттеры) или record и решите, нужны ли аннотации Jackson.
- Сохраните результат как Root.java и переименуйте классы под свой проект.
Как это работает
Пример разбирается в «форму»: для каждого ключа — все типы, которые встретились на этом месте. Все объекты одного массива сливаются в один класс.
- Имена полей — camelCase: order_id → orderId, gift_note → giftNote. Геттеры по правилам JavaBeans: getOrderId(), а для примитива boolean — isPaid().
- Имена классов берутся из ключей: items хранит List
- , customer становится Customer.
- Импортируется только нужное: java.util.List и com.fasterxml.jackson.annotation.JsonProperty.
- Если на верхнем уровне массив, комментарий подскажет тип для чтения, например List.
Пример
{"items":[{"sku":"A","note":null,"qty":1},{"sku":"B","note":"x"}]} в виде record даёт:
import java.util.List;
public record Root(
List<Item> items
) {
public record Item(
String sku,
String note,
Long qty
) {}
}
qty нет во втором элементе, поэтому это обёртка Long, которая может быть null.
Советы
- Читайте через Jackson:
new ObjectMapper().readValue(json, Root.class).
- Добавьте
@JsonIgnoreProperties(ignoreUnknown = true), если в реальных данных могут быть ключи, которых не было в примере.
- Проверьте числовые типы: цена, которая в примере всегда была целой, станет long.
Частые вопросы
Как типы JSON сопоставляются с Java?
Строки становятся String, true и false — boolean, целые числа — long, остальные — double (смесь — double). Массивы становятся List<T>, объекты — отдельными классами, а место со значениями разных видов — Object.
Когда используется Long вместо long?
Примитив не может хранить null. Если в примере у числа или логического значения есть null или ключа нет в части объектов массива, берётся обёртка: Long, Double, Boolean. Внутри List<...> обёртка используется всегда — этого требуют дженерики Java.
Почему остальные классы вложены в Root?
В одном файле Java может быть только один публичный класс верхнего уровня. Вложенные public static классы (или вложенные record) делают результат одним файлом Root.java, который компилируется как есть. Обращайтесь к ним как Root.Item или вынесите в отдельные файлы.
Что происходит с ключами вроде first-name или class?
Имена полей — camelCase из ключа: first-name становится firstName, а ключевое слово Java получает подчёркивание: class_. С Jackson такие поля получают @JsonProperty("first-name"), без него исходный ключ сохраняется в комментарии.
Работают ли record с Jackson?
Да, Jackson 2.12 и новее десериализует record через канонический конструктор, а @JsonProperty на компоненте record работает так же, как на поле.