JSON to Java

Генерация Java POJO-классов из JSON

Попробовать пример
Имя корневого класса:

Ввод JSON

Вывод Java

Работает локально · Безопасно вставлять секреты
Java-классы появятся здесь…

Что такое конвертация JSON в Java-классы?

Конвертация JSON в Java-классы берёт исходный JSON-объект и создаёт определения Plain Old Java Object (POJO) с приватными полями, геттерами и сеттерами. В Java нет встроенной типовой системы для JSON, поэтому каждый API-ответ, конфигурационный файл или сообщение в очереди требует соответствующего класса, прежде чем с ним можно будет работать типобезопасно. Библиотеки Jackson и Gson сопоставляют ключи JSON с полями Java через рефлексию, но для этого определения классов должны существовать заранее.

Стандартный Java POJO для десериализации JSON объявляет приватное поле для каждого ключа JSON, конструктор без аргументов и пару геттер/сеттер для каждого поля. Вложенные JSON-объекты становятся отдельными классами. Массивы превращаются в поля типа List<T> с импортом java.util.List. Примитивные типы JSON соответствуют примитивам Java (int, double, boolean) или их типам-обёрткам (Integer, Double, Boolean) при использовании в обобщённых типах. Значения null обычно отображаются на Object или обнуляемый ссылочный тип.

Писать эти определения классов вручную — механическая работа. Нужно прочитать каждый ключ JSON, определить тип Java по значению, преобразовать именование из camelCase JSON в camelCase-поля Java, создать имена классов в PascalCase для вложенных объектов и добавить шаблонный код геттеров и сеттеров. Для JSON-объекта с 15 полями и 3 вложенными объектами это означает написание 4 классов, 30+ методов и поддержание согласованности всего этого. Конвертер делает то же самое за миллисекунды.

Зачем использовать конвертер JSON в Java?

Создавать Java POJO из JSON вручную — значит проверять каждое поле, угадывать типы по примерам значений, писать пары геттер/сеттер и повторять всё это для каждого вложенного объекта. При изменении API-контракта всё нужно обновлять вручную. Конвертер устраняет эту механическую работу.

Мгновенная генерация POJO
Вставьте JSON и получите полные определения Java-классов менее чем за секунду. Вложенные объекты, списки и примитивные типы определяются и сопоставляются автоматически.
🔒
Конфиденциальность данных
Конвертация выполняется полностью в браузере с помощью JavaScript. JSON не покидает вашу машину. API-ключи, токены и рабочие данные остаются приватными.
📝
Корректное определение типов
Каждое сгенерированное поле использует подходящий Java-тип, выведенный из значения JSON: String, int, double, boolean, List<T> или Object для null-значений. Типы-обёртки применяются внутри обобщённых типов.
📦
Без установки и регистрации
Откройте страницу и вставьте JSON. JDK не нужен, Maven-зависимости устанавливать не нужно, аккаунт создавать не нужно. Работает на любом устройстве с браузером.

Сценарии использования JSON to Java

Разработка API на Spring Boot
Генерируйте DTO для запросов и ответов из примеров API JSON. Вставьте ожидаемую форму payload и получите Java-классы, готовые для аннотаций @RequestBody и @ResponseBody в Spring-контроллерах.
Разработка Android-приложений
Создавайте классы моделей для сетевых ответов Retrofit или Volley. Вставьте JSON, возвращаемый backend-API, и получите POJO, совместимые с конвертерами Gson или Moshi.
Интеграция микросервисов
Определяйте типизированные классы сообщений для JSON-пейлоадов Kafka, RabbitMQ или gRPC. Вставьте пример сообщения и сгенерируйте POJO, документирующие ожидаемый контракт между сервисами.
Миграция устаревших систем
Конвертируйте JSON API-ответы в Java-классы при оборачивании REST-эндпоинтов в типизированный клиент. Удобно при переходе от слабо типизированных паттернов Map<String, Object> к полноценным доменным моделям.
QA и автоматизация тестирования
Создавайте типизированные тестовые фикстуры из примеров API-ответов. QA-инженеры могут вставить реальные JSON-ответы и получить определения POJO для использования в тестовых наборах JUnit или TestNG с проверками AssertJ.
Изучение ООП-паттернов Java
Студенты могут вставить любую JSON-структуру и увидеть, как Java представляет её с помощью классов, полей, геттеров, сеттеров и вложенных типов. Результат делает абстрактное конкретным.

Таблица соответствия типов JSON и Java

Каждое значение JSON соответствует определённому Java-типу. В таблице ниже показано, как конвертер транслирует каждый тип JSON в его Java-эквивалент. Столбец «Альтернатива» содержит типы-обёртки, используемые внутри обобщённых типов (например, List<T>), а также более новые возможности Java, такие как Records.

Тип JSONПримерТип JavaАльтернатива
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Справочник по Java JSON-аннотациям

При десериализации JSON с помощью Jackson или Gson аннотации управляют сопоставлением ключей JSON с полями Java, обработкой неизвестных полей и поведением при null-значениях. В этом справочнике рассмотрены аннотации, которые встречаются чаще всего при работе с генерируемыми POJO.

АннотацияНазначениеБиблиотека
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

В Java есть три распространённых подхода к определению типизированных структур для хранения JSON-данных. Каждый подходит для своего стиля проекта и версии Java. POJO — традиционный паттерн с наибольшей совместимостью. Records сокращают шаблонный код для неизменяемых данных. Lombok генерирует геттеры, сеттеры и конструкторы во время компиляции через аннотации.

POJO
Традиционный Java-паттерн. Работает с Java 8+. Вы определяете приватные поля и методы геттер/сеттер. Полный контроль над изменяемостью и пользовательской логикой. Совместим с любой JSON-библиотекой (Jackson, Gson, Moshi). Стандартный выбор для Spring Boot, Android и корпоративных кодовых баз.
Record (Java 16+)
Встроен начиная с Java 16 (превью в 14). Компактный синтаксис: record User(int id, String name) генерирует конструктор, аксессоры, equals, hashCode и toString. Экземпляры неизменяемы. Jackson поддерживает records с версии 2.12. Лучший выбор для объектов-значений и DTO, где сеттеры не нужны.
Lombok @Data
Сторонний процессор аннотаций, выполняемый во время компиляции. @Data генерирует геттеры, сеттеры, equals, hashCode и toString. @Builder добавляет паттерн Builder. Сокращает шаблонный код до уровня records, сохраняя изменяемость. Требует добавления Lombok в сборочный инструмент (Maven/Gradle) и плагина для IDE.

Примеры кода

Эти примеры показывают, как использовать сгенерированные Java POJO с Jackson для десериализации, как программно создавать Java-классы из JavaScript и Python, а также как применять CLI-инструмент jsonschema2pojo для пакетной генерации.

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

Часто задаваемые вопросы

В чём разница между POJO и Java Bean?
POJO (Plain Old Java Object) — это любой простой Java-класс без зависимостей от фреймворков. Java Bean — это POJO, следующий определённым соглашениям: конструктор без аргументов, приватные поля с публичными геттерами и сеттерами, а также реализация Serializable. Для работы с JSON большинство библиотек требует соглашений Bean (геттеры/сеттеры), но не требует Serializable. Классы, генерируемые этим инструментом, следуют паттерну геттер/сеттер Bean.
Какую JSON-библиотеку использовать с генерируемыми POJO?
Jackson (com.fasterxml.jackson) — наиболее широко используемая Java JSON-библиотека и библиотека по умолчанию в Spring Boot. Gson (com.google.gson) популярна в Android-проектах и имеет более простой API. Moshi — более новая альтернатива от Square, разработанная для совместимости с Kotlin. Все три работают со стандартными POJO, у которых есть геттеры и сеттеры.
Как конвертер обрабатывает вложенные JSON-объекты?
Каждый вложенный объект становится отдельным Java-классом. Если поле JSON с именем "address" содержит объект с ключами "street" и "city", конвертер создаёт класс Address с этими полями и типизирует родительское поле как Address. Глубоко вложенные структуры порождают несколько определений классов.
Что происходит, когда значение JSON-поля равно null?
Поля с null типизируются как Object, поскольку конвертер не может вывести предполагаемый тип из одного лишь null-значения. На практике нужно заменить Object на ожидаемый тип (String, Integer и т. д.), когда станет известен API-контракт. При использовании Jackson null-значения по умолчанию присваиваются полям ссылочного типа без ошибок.
Следует ли использовать Java Records вместо POJO для JSON?
Records хорошо подходят для неизменяемых объектов передачи данных, где сеттеры не нужны. Jackson поддерживает records с версии 2.12, Gson добавил поддержку в более поздних выпусках. Если проект работает на Java 16+ и API-ответы трактуются как данные только для чтения, records сокращают шаблонный код. Если нужна изменяемость или целевая версия — Java 8/11, придерживайтесь POJO.
Как обрабатывать ключи JSON, недопустимые в качестве Java-идентификаторов?
Ключи JSON вида "first-name" или "2nd_place" не являются допустимыми именами полей Java. Используйте @JsonProperty("first-name") в Jackson или @SerializedName("first-name") в Gson, чтобы сопоставить ключ JSON с допустимым именем поля Java, например firstName. Конвертер автоматически приводит имена ключей к camelCase-полям Java.
Можно ли генерировать Java-классы из JSON Schema вместо примера JSON?
Этот инструмент генерирует классы из примеров JSON-данных. Для ввода в формате JSON Schema используйте проект jsonschema2pojo (доступен как CLI-инструмент, Maven-плагин и Gradle-плагин). Он читает файл JSON Schema и создаёт аннотированные Java-классы с ограничениями валидации, значениями по умолчанию и документацией из описаний схемы.