JSON to Java

Java POJO-Klassen aus JSON generieren

Beispiel ausprobieren
Name der Root-Klasse:

JSON-Eingabe

Java-Ausgabe

Läuft lokal · Sicher zum Einfügen von Secrets
Java-Klassen erscheinen hier…

Was ist die JSON-zu-Java-Klassenkonvertierung?

Die JSON-zu-Java-Klassenkonvertierung nimmt ein rohes JSON-Objekt und erzeugt daraus Plain Old Java Object (POJO)-Definitionen mit privaten Feldern, Gettern und Settern. Java verfügt über kein eingebautes JSON-Typsystem, daher benötigt jede API-Antwort, jede Konfigurationsdatei und jeder Message-Payload eine entsprechende Klasse, bevor man typsicher damit arbeiten kann. Bibliotheken wie Jackson und Gson bilden JSON-Schlüssel über Reflection auf Java-Felder ab, setzen aber voraus, dass die Klassendefinitionen bereits vorhanden sind.

Ein Standard-Java-POJO für die JSON-Deserialisierung deklariert für jeden JSON-Schlüssel ein privates Feld, einen Konstruktor ohne Argumente sowie ein Getter/Setter-Paar pro Feld. Verschachtelte JSON-Objekte werden zu separaten Klassen. Arrays werden zu List<T>-Feldern mit einem java.util.List-Import. Primitive JSON-Typen werden auf Java-Primitive (int, double, boolean) oder deren Wrapper-Typen (Integer, Double, Boolean) abgebildet, wenn sie innerhalb von Generics verwendet werden. Null-Werte werden typischerweise auf Object oder einen nullbaren Referenztyp abgebildet.

Diese Klassendefinitionen von Hand zu schreiben ist repetitiv. Man liest jeden JSON-Schlüssel, ermittelt den Java-Typ aus dem Wert, konvertiert Namenskonventionen von camelCase-JSON zu camelCase-Java-Feldern, erstellt PascalCase-Klassennamen für verschachtelte Objekte und fügt den Getter/Setter-Boilerplate hinzu. Bei einem JSON-Objekt mit 15 Feldern und 3 verschachtelten Objekten bedeutet das: 4 Klassen, 30+ Methoden schreiben und alles konsistent halten. Ein Konverter erledigt das in Millisekunden.

Warum einen JSON-zu-Java-Konverter verwenden?

POJOs manuell aus JSON zu erstellen bedeutet: jedes Feld inspizieren, Typen aus Beispielwerten ableiten, Getter/Setter-Paare schreiben und diesen Prozess für jedes verschachtelte Objekt wiederholen. Ändert sich der API-Vertrag, muss alles per Hand aktualisiert werden. Ein Konverter nimmt diese mechanische Arbeit ab.

Sofortige POJO-Generierung
JSON einfügen und vollständige Java-Klassendefinitionen in unter einer Sekunde erhalten. Verschachtelte Objekte, Listen und primitive Typen werden automatisch erkannt und abgebildet.
🔒
Datenschutz-First-Verarbeitung
Die Konvertierung läuft vollständig im Browser per JavaScript. Die JSON-Daten verlassen das eigene Gerät nicht. API-Keys, Tokens und Produktionsdaten bleiben privat.
📝
Korrekte Typableitung
Jedes generierte Feld verwendet den passenden Java-Typ, der aus dem JSON-Wert abgeleitet wird: String, int, double, boolean, List<T> oder Object für null-Werte. Wrapper-Typen werden innerhalb von Generics verwendet.
📦
Keine Installation oder Registrierung
Seite öffnen und JSON einfügen. Kein JDK, keine Maven-Abhängigkeiten, kein Konto. Funktioniert auf jedem Gerät mit einem Browser.

JSON-zu-Java-Anwendungsfälle

Spring Boot API-Entwicklung
Request- und Response-DTOs aus API-JSON-Beispielen generieren. Den erwarteten Payload einfügen und Java-Klassen erhalten, die für @RequestBody- und @ResponseBody-Annotationen in Spring-Controllern bereit sind.
Android-App-Entwicklung
Modellklassen für Retrofit- oder Volley-Netzwerkantworten erstellen. Das von der Backend-API zurückgelieferte JSON einfügen und POJOs erhalten, die mit Gson- oder Moshi-Konvertern kompatibel sind.
Microservice-Integration
Typisierte Message-Klassen für Kafka-, RabbitMQ- oder gRPC-JSON-Payloads definieren. Eine Beispielnachricht einfügen und POJOs generieren, die den erwarteten Vertrag zwischen Services dokumentieren.
Migration von Legacy-Systemen
JSON-API-Antworten in Java-Klassen konvertieren, wenn REST-Endpunkte in einem typisierten Client gekapselt werden. Nützlich beim Wechsel von lose typisierten Map<String, Object>-Mustern zu echten Domain-Modellen.
QA und Test-Automatisierung
Typisierte Test-Fixtures aus API-Antwortbeispielen erstellen. QA-Ingenieure können echte JSON-Antworten einfügen und POJO-Definitionen für JUnit- oder TestNG-Testsuiten mit AssertJ-Assertions erzeugen.
Java-OOP-Muster erlernen
Lernende können beliebige JSON-Strukturen einfügen und sehen, wie Java diese mit Klassen, Feldern, Gettern, Settern und verschachtelten Typen abbildet. Die Ausgabe macht das Abstrakte konkret.

JSON-zu-Java-Typ-Mapping

Jeder JSON-Wert wird auf einen bestimmten Java-Typ abgebildet. Die folgende Tabelle zeigt, wie der Konverter jeden JSON-Typ in sein Java-Äquivalent übersetzt. Die Spalte Alternative zeigt Wrapper-Typen, die in generischen Kontexten wie List<T> verwendet werden, oder neuere Java-Features wie Records.

JSON-TypBeispielJava-TypAlternative
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-Annotations-Referenz

Bei der Deserialisierung von JSON mit Jackson oder Gson steuern Annotationen, wie JSON-Schlüssel auf Java-Felder abgebildet werden, wie unbekannte Felder behandelt werden und wie mit null-Werten umgegangen wird. Diese Referenz behandelt die Annotationen, die beim Arbeiten mit generierten POJOs am häufigsten vorkommen.

AnnotationZweckBibliothek
@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 bietet drei gängige Ansätze, um typisierte Strukturen für JSON-Daten zu definieren. Jeder passt zu einem anderen Projektstil und einer anderen Java-Version. POJOs sind das traditionelle Muster mit der breitesten Kompatibilität. Records reduzieren Boilerplate für unveränderliche Daten. Lombok generiert Getter, Setter und Konstruktoren zur Compile-Zeit über Annotationen.

POJO
Traditionelles Java-Muster. Funktioniert ab Java 8. Man definiert private Felder sowie Getter/Setter-Methoden. Volle Kontrolle über Mutabilität und benutzerdefinierte Logik. Kompatibel mit jeder JSON-Bibliothek (Jackson, Gson, Moshi). Die Standardwahl für Spring Boot, Android und Enterprise-Codebasen.
Record (Java 16+)
Seit Java 16 fest integriert (Preview in 14). Kompakte Syntax: record User(int id, String name) generiert Konstruktor, Accessors, equals, hashCode und toString. Instanzen sind unveränderlich. Jackson unterstützt Records ab Version 2.12. Ideal für Value-Objekte und DTOs, bei denen keine Setter benötigt werden.
Lombok @Data
Drittanbieter-Annotationsprozessor zur Compile-Zeit. @Data generiert Getter, Setter, equals, hashCode und toString. @Builder fügt ein Builder-Muster hinzu. Reduziert Boilerplate auf nahezu Record-Niveau bei erhaltener Mutabilität. Erfordert die Einbindung von Lombok im Build-Tool (Maven/Gradle) und ein IDE-Plugin.

Code-Beispiele

Diese Beispiele zeigen, wie generierte Java-POJOs mit Jackson für die Deserialisierung verwendet werden, wie Java-Klassen programmgesteuert aus JavaScript und Python erzeugt werden und wie das jsonschema2pojo-CLI-Tool für die Batch-Generierung eingesetzt wird.

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

Häufig gestellte Fragen

Was ist der Unterschied zwischen einem POJO und einem Java Bean?
Ein POJO (Plain Old Java Object) ist eine einfache Java-Klasse ohne Framework-Abhängigkeiten. Ein Java Bean ist ein POJO, das bestimmte Konventionen einhält: einen Konstruktor ohne Argumente, private Felder mit öffentlichen Gettern und Settern sowie die Implementierung von Serializable. Für das JSON-Mapping verlangen die meisten Bibliotheken die Bean-Konventionen (Getter/Setter), aber nicht Serializable. Die von diesem Tool generierten Klassen folgen dem Bean-Getter/Setter-Muster.
Welche JSON-Bibliothek sollte ich mit generierten POJOs verwenden?
Jackson (com.fasterxml.jackson) ist die am weitesten verbreitete Java-JSON-Bibliothek und der Standard in Spring Boot. Gson (com.google.gson) ist in Android-Projekten beliebt und bietet eine einfachere API. Moshi ist eine neuere Alternative von Square, die für Kotlin-Interoperabilität konzipiert wurde. Alle drei funktionieren mit Standard-POJOs, die Getter und Setter haben.
Wie behandelt der Konverter verschachtelte JSON-Objekte?
Jedes verschachtelte Objekt wird zu einer eigenen Java-Klasse. Enthält ein JSON-Feld namens "address" ein Objekt mit den Schlüsseln "street" und "city", erstellt der Konverter eine Address-Klasse mit diesen Feldern und typisiert das übergeordnete Feld als Address. Tief verschachtelte Strukturen erzeugen mehrere Klassendefinitionen.
Was passiert, wenn ein JSON-Feld null ist?
Null-Felder werden als Object typisiert, weil der Konverter den beabsichtigten Typ aus einem null-Wert allein nicht ableiten kann. In der Praxis ersetzt man Object durch den erwarteten Typ (String, Integer usw.), sobald der API-Vertrag bekannt ist. Bei Verwendung von Jackson werden null-Werte standardmäßig Referenztyp-Feldern zugewiesen, ohne Fehler zu verursachen.
Sollte ich Java Records statt POJOs für JSON verwenden?
Records eignen sich gut für unveränderliche Datentransferobjekte, bei denen keine Setter benötigt werden. Jackson unterstützt Records ab Version 2.12, und Gson hat Support in späteren Releases ergänzt. Wenn das Projekt auf Java 16+ läuft und API-Antworten als schreibgeschützte Daten behandelt werden, reduzieren Records den Boilerplate. Bei Bedarf an Mutabilität oder bei Java 8/11 als Zielversion bleiben POJOs die bessere Wahl.
Wie gehe ich mit JSON-Schlüsseln um, die keine gültigen Java-Bezeichner sind?
JSON-Schlüssel wie "first-name" oder "2nd_place" sind keine gültigen Java-Feldnamen. Mit @JsonProperty("first-name") in Jackson oder @SerializedName("first-name") in Gson lässt sich der JSON-Schlüssel auf einen gültigen Java-Feldnamen wie firstName abbilden. Der Konverter konvertiert Schlüsselnamen automatisch in camelCase-Java-Felder.
Kann ich Java-Klassen aus einem JSON Schema statt aus einem JSON-Beispiel generieren?
Dieses Tool generiert Klassen aus JSON-Datenbeispielen. Für JSON-Schema-Eingaben empfiehlt sich das jsonschema2pojo-Projekt (verfügbar als CLI-Tool, Maven-Plugin und Gradle-Plugin). Es liest eine JSON-Schema-Datei und erzeugt annotierte Java-Klassen mit Validierungseinschränkungen, Standardwerten und Dokumentation aus den Schema-Beschreibungen.