JSON to Java

Generování Java POJO tříd z JSON

Zkusit příklad
Název kořenové třídy:

Vstup JSON

Výstup Java

Běží lokálně · Bezpečné pro vkládání tajných údajů
Java třídy se zobrazí zde…

Co je převod JSON na Java třídy?

Převod JSON na Java třídy vezme surový JSON objekt a vytvoří definice Plain Old Java Object (POJO) s privátními poli, gettery a settery. Java nemá vestavěný typový systém pro JSON, takže každá JSON API odpověď, konfigurační soubor nebo zpráva vyžaduje odpovídající třídu, než s ní můžete pracovat typově bezpečně. Knihovny jako Jackson a Gson mapují JSON klíče na Java pole pomocí reflexe, ale vyžadují, aby definice tříd existovaly předem.

Standardní Java POJO pro deserializaci JSON deklaruje privátní pole pro každý JSON klíč, konstruktor bez argumentů a pár getter/setter pro každé pole. Vnořené JSON objekty se stávají samostatnými třídami. Pole se stávají poli List<T> s importem java.util.List. Primitivní JSON typy se mapují na Java primitivy (int, double, boolean) nebo jejich obalové typy (Integer, Double, Boolean) při použití uvnitř generik. Hodnoty null se typicky mapují na Object nebo na referenční typ připouštějící null.

Ruční psaní těchto definic tříd je opakující se práce. Čtete každý JSON klíč, určujete Java typ z hodnoty, převádíte pojmenovací konvence z camelCase JSON na camelCase Java pole, vytváříte PascalCase názvy tříd pro vnořené objekty a přidáváte getter/setter šablony. Pro JSON objekt s 15 poli a 3 vnořenými objekty to znamená napsat 4 třídy, více než 30 metod a udržovat vše konzistentní. Převodník to zvládne v milisekundách.

Proč používat převodník JSON na Java?

Ruční vytváření Java POJO z JSON znamená procházet každé pole, odvozovat typy z ukázkových hodnot, psát páry getter/setter a opakovat celý proces pro každý vnořený objekt. Když se API kontrakt změní, vše aktualizujete ručně. Převodník tuto mechanickou práci odstraní.

Okamžité generování POJO
Vložte JSON a získejte kompletní definice Java tříd za méně než sekundu. Vnořené objekty, seznamy a primitivní typy jsou automaticky detekovány a namapovány.
🔒
Zpracování s ochranou soukromí
Převod probíhá celý ve vašem prohlížeči pomocí JavaScriptu. Vaše JSON data nikdy neopustí vaše zařízení. API klíče, tokeny a produkční data zůstávají soukromé.
📝
Správné odvozování typů
Každé generované pole používá odpovídající Java typ odvozený z JSON hodnoty: String, int, double, boolean, List<T> nebo Object pro null hodnoty. Obalové typy jsou použity uvnitř generik.
📦
Bez instalace nebo registrace
Otevřete stránku a vložte JSON. Žádné JDK, žádné Maven závislosti, žádný účet. Funguje na jakémkoli zařízení s prohlížečem.

Případy použití JSON na Java

Vývoj Spring Boot API
Generujte request a response DTO z ukázek API JSON. Vložte očekávaný tvar payloadu a získejte Java třídy připravené pro anotace @RequestBody a @ResponseBody v Spring kontrolerech.
Vývoj aplikací pro Android
Vytvářejte třídy modelů pro síťové odpovědi Retrofit nebo Volley. Vložte JSON vrácený vaším backendovým API a získejte POJO kompatibilní s konvertory Gson nebo Moshi.
Integrace mikroslužeb
Definujte typované třídy zpráv pro JSON payloady Kafka, RabbitMQ nebo gRPC. Vložte ukázkovou zprávu a generujte POJO, které dokumentují očekávaný kontrakt mezi službami.
Migrace starších systémů
Převádějte JSON API odpovědi na Java třídy při obalování REST endpointů do typovaného klienta. Užitečné při migraci z volně typovaných vzorů Map<String, Object> na správné doménové modely.
QA a testovací automatizace
Vytvářejte typované testovací přípravky z ukázek API odpovědí. QA inženýři mohou vložit reálné JSON odpovědi a vyprodukovat definice POJO pro použití v testovacích sadách JUnit nebo TestNG s asercemi AssertJ.
Výuka OOP vzorů v Javě
Studenti mohou vložit libovolnou JSON strukturu a vidět, jak ji Java reprezentuje pomocí tříd, polí, getterů, setterů a vnořených typů. Výstup zpřesňuje abstraktní pojmy na konkrétní příklady.

Mapování typů JSON na Java

Každá JSON hodnota se mapuje na specifický Java typ. Tabulka níže ukazuje, jak převodník překládá každý JSON typ na jeho Java ekvivalent. Sloupec Alternativa zobrazuje obalové typy používané v generických kontextech jako List<T> nebo novější Java funkce jako Records.

Typ JSONPříkladTyp JavaAlternativa
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>

Přehled Java JSON anotací

Při deserializaci JSON pomocí Jackson nebo Gson anotace řídí, jak se JSON klíče mapují na Java pole, jak jsou zpracovávána neznámá pole a jak jsou ošetřeny hodnoty null. Tento přehled zahrnuje anotace, se kterými se při práci s generovanými POJO setkáte nejčastěji.

AnotaceÚčelKnihovna
@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 nabízí tři běžné přístupy pro definování typovaných struktur pro uchovávání JSON dat. Každý se hodí pro jiný styl projektu a verzi Javy. POJO jsou tradiční vzor s nejširší kompatibilitou. Records snižují šablonový kód pro neměnitelná data. Lombok generuje gettery, settery a konstruktory při kompilaci pomocí anotací.

POJO
Tradiční Java vzor. Funguje s Java 8+. Definujete privátní pole plus metody getter/setter. Plná kontrola nad mutabilitou a vlastní logikou. Kompatibilní s každou JSON knihovnou (Jackson, Gson, Moshi). Standardní volba pro Spring Boot, Android a podnikové projekty.
Record (Java 16+)
Integrováno od Java 16 (preview ve verzi 14). Kompaktní syntaxe: record User(int id, String name) generuje konstruktor, přístupové metody, equals, hashCode a toString. Instance jsou neměnitelné. Jackson podporuje records od verze 2.12. Nejvhodnější pro hodnotové objekty a DTO, kde nepotřebujete settery.
Lombok @Data
Zpracovatel anotací třetí strany při kompilaci. @Data generuje gettery, settery, equals, hashCode a toString. @Builder přidává vzor builder. Snižuje šablonový kód na úroveň blízkou Records při zachování mutability. Vyžaduje přidání Lombok do sestavovacího nástroje (Maven/Gradle) a plugin pro IDE.

Příklady kódu

Tyto příklady ukazují, jak používat generované Java POJO s Jackson pro deserializaci, jak programově vytvářet Java třídy z JavaScriptu a Pythonu a jak používat nástroj jsonschema2pojo CLI pro dávkové generování.

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

Časté dotazy

Jaký je rozdíl mezi POJO a Java Bean?
POJO (Plain Old Java Object) je jakákoli jednoduchá Java třída bez závislostí na frameworku. Java Bean je POJO, které dodržuje specifické konvence: konstruktor bez argumentů, privátní pole s veřejnými gettery a settery a implementuje Serializable. Pro mapování JSON většina knihoven vyžaduje Bean konvence (gettery/settery), ale nevyžaduje Serializable. Třídy generované tímto nástrojem dodržují vzor getter/setter z Bean.
Kterou JSON knihovnu mám používat s generovanými POJO?
Jackson (com.fasterxml.jackson) je nejpoužívanější Java JSON knihovna a výchozí volba ve Spring Boot. Gson (com.google.gson) je populární v Android projektech a má jednodušší API. Moshi je novější alternativa od Square, navržená pro interoperabilitu s Kotlinem. Všechny tři fungují se standardními POJO, které mají gettery a settery.
Jak převodník zpracovává vnořené JSON objekty?
Každý vnořený objekt se stane samostatnou Java třídou. Pokud JSON pole s názvem "address" obsahuje objekt s klíči "street" a "city", převodník vytvoří třídu Address s těmito poli a nadřazené pole typuje jako Address. Hluboce vnořené struktury produkují více definic tříd.
Co se stane, když je JSON pole null?
Pole s hodnotou null jsou typována jako Object, protože převodník nemůže odvodit zamýšlený typ pouze z hodnoty null. V praxi byste Object nahradili očekávaným typem (String, Integer atd.), jakmile znáte API kontrakt. Při použití Jackson jsou hodnoty null přiřazeny referenčním polím ve výchozím nastavení bez chyb.
Mám pro JSON používat Java Records místo POJO?
Records fungují dobře pro neměnitelné datové přenosové objekty, kde nepotřebujete settery. Jackson podporuje records od verze 2.12 a Gson přidal podporu v pozdějších verzích. Pokud váš projekt běží na Java 16+ a API odpovědi považujete za data pouze pro čtení, records snižují šablonový kód. Pokud potřebujete mutabilitu nebo cílíte na Java 8/11, zůstaňte u POJO.
Jak zpracovat JSON klíče, které nejsou platnými Java identifikátory?
JSON klíče jako "first-name" nebo "2nd_place" nejsou platnými názvy Java polí. Použijte @JsonProperty("first-name") v Jackson nebo @SerializedName("first-name") v Gson pro mapování JSON klíče na platný název Java pole jako firstName. Převodník automaticky převádí názvy klíčů na camelCase Java pole.
Mohu generovat Java třídy z JSON Schema místo z ukázky JSON?
Tento nástroj generuje třídy z ukázek JSON dat. Pro vstup ve formátu JSON Schema použijte projekt jsonschema2pojo (dostupný jako CLI nástroj, Maven plugin a Gradle plugin). Čte soubor JSON Schema a produkuje anotované Java třídy s omezeními validace, výchozími hodnotami a dokumentací z popisů schématu.