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 або посилальний тип, що допускає null.

Написання таких визначень класів вручну є монотонним. Ви читаєте кожен JSON-ключ, визначаєте тип Java за значенням, перетворюєте конвенції іменування з camelCase JSON на поля camelCase Java, створюєте назви класів у PascalCase для вкладених об'єктів і додаєте шаблонний код гетерів/сеттерів. Для JSON-об'єкта з 15 полями та 3 вкладеними об'єктами це означає написання 4 класів, понад 30 методів і підтримку узгодженості. Конвертер виконує це за мілісекунди.

Навіщо використовувати конвертер JSON to 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

Розробка Spring Boot API
Генеруйте DTO запитів і відповідей із JSON-зразків API. Вставте очікувану форму пейлоаду й отримайте класи Java, готові для анотацій @RequestBody і @ResponseBody у Spring-контролерах.
Розробка Android-застосунків
Створюйте класи моделей для відповідей Retrofit або Volley на мережеві запити. Вставте JSON, що повертає ваш бекенд 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 додає патерн будівельника. Зменшує шаблонний код до рівня, близького до 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. Конвертер автоматично перетворює назви ключів на поля Java у camelCase.
Чи можна генерувати Java-класи з JSON Schema замість JSON-зразка?
Цей інструмент генерує класи із JSON-зразків даних. Для вхідних даних у форматі JSON Schema використовуйте проект jsonschema2pojo (доступний як CLI-інструмент, плагін Maven і плагін Gradle). Він читає файл JSON Schema та генерує анотовані Java-класи з обмеженнями валідації, значеннями за замовчуванням і документацією з описів схеми.