Typen und Klassen aus JSON erzeugen

Am schnellsten kommst du zu Modelltypen für eine API, wenn du sie aus einer echten Antwort erzeugst: JSON einfügen, Sprache wählen, Code kopieren. Ein Generator liest jeden Wert, entscheidet, ob es Text, eine Ganzzahl, eine Dezimalzahl oder ein Datum ist, und macht aus verschachtelten Objekten eigene Typen. Diese Anleitung erklärt, was ein solcher Generator aus einem Beispiel wissen kann und was nicht, und was du prüfen solltest, bevor der Code in dein Projekt wandert.

4 Min. Lesezeit

Warum überhaupt Typen erzeugen

Typisierte Modelle fangen Fehler früh ab. Wird die Antwort einer API durch ein Interface oder eine Klasse beschrieben, vervollständigt dein Editor Feldnamen, der Compiler bemerkt einen falsch geschriebenen Schlüssel, und ein umbenanntes Feld taucht als Fehler auf statt als stilles undefined oder null zur Laufzeit. Diese Typen für eine Antwort mit fünfzig Feldern und drei Verschachtelungsebenen von Hand zu schreiben kostet Zeit, und Fehler passieren leicht.

Ein Generator erledigt den eintönigen Teil in einer Sekunde. Das Ergebnis ist ein guter erster Entwurf, den du dann prüfst, wo nötig umbenennst und eincheckst.

Hier ausprobieren: JSON in Code umwandeln

Vollständige Tool-Seite öffnen

Was ein Generator aus deinem Beispiel ableitet

Alles stammt aus den Werten in deinem JSON. Deshalb zählt die Qualität des Beispiels mehr als alles andere.

Im JSONAbgeleitet alsBeispiel
Textstring"name": "Lena"
Ganzzahlint, oder long über 2.147.483.647"id": 42
Zahl mit Dezimalpunktdouble oder float"price": 19.0
true oder falseboolean"active": true
Text im ISO-DatumsformatDatumstyp, wenn eingeschaltet"created": "2026-10-27T09:30:00Z"
null in manchen Einträgennullable Typ"phone": null
Schlüssel fehlt in manchen Einträgenoptionales Feld"discount" nur in einem Eintrag
Objektein neuer benannter Typ"address": { ... }
Liste von ObjektenListe eines zusammengeführten Typs"items": [ { ... }, { ... } ]

Gib ihm ein abwechslungsreiches Beispiel

Ein Generator kann nur beschreiben, was er sieht. Enthält dein Beispiel eine Bestellung mit einem Artikel, wirkt jedes Feld wie ein Pflichtfeld und keines wie nullable. Enthält es eine Liste von Bestellungen, von denen manche einen Rabatt haben und manche nicht, wird das Rabattfeld korrekt als optional markiert.

Sammle also vor dem Erzeugen eine Antwort mit mehreren Einträgen, am besten mit Grenzfällen: ein Kunde ohne Telefonnummer, eine Bestellung ohne Artikel, ein Produkt mit Dezimalpreis. Pack sie auf oberster Ebene in ein Array, dann führt der Generator alle zu einem Typ pro Struktur zusammen.

  • Felder, die in jedem Eintrag null sind, bekommen einen allgemeinen Typ wie unknown, object oder Any, weil der echte Typ nicht sichtbar ist.
  • Leere Listen werden aus demselben Grund zu Listen mit Einträgen vom Typ unknown.
  • Ein Feld, das in einem Eintrag eine Zahl und in einem anderen Text ist, wird in TypeScript zu einer Union und in anderen Sprachen zu einem allgemeinen Typ.
  • Große IDs über 2^53, wie manche Datenbankschlüssel, sind als Text sicherer. JavaScript kann sie als Zahlen nicht exakt darstellen.

Namen, Attribute und Konventionen

JSON-Schlüssel folgen oft dem Stil des Backends, zum Beispiel snake_case aus Python oder Ruby, während dein Client-Code einen anderen nutzt. Ein guter Generator benennt Felder nach der Konvention der Zielsprache um und behält den ursprünglichen Schlüssel in einem Attribut, damit die Serialisierung weiterhin zu den Daten passt.

SpracheFeldnamenSo bleibt der JSON-Schlüssel erhalten
TypeScriptUnverändertNicht nötig; ungewöhnliche Schlüssel kommen in Anführungszeichen
C#PascalCase[JsonPropertyName] oder [JsonProperty]
Pythonsnake_caseField(alias=...) in Pydantic
GoExportiert, mit ID und URLStruct-Tags json:"key"
JavacamelCase@JsonProperty (Jackson)
KotlincamelCase@SerialName (kotlinx.serialization)

Typen sind keine Validierung

Ein TypeScript-Interface verschwindet beim Kompilieren. Schickt die API etwas anderes, als das Interface verspricht, hält das zur Laufzeit niemand auf. Dasselbe gilt in den meisten Sprachen für einfache Klassen: Der Deserializer füllt, was er kann, und lässt den Rest leer.

Kommen die Daten von außerhalb deiner Kontrolle, validiere sie beim Eintreffen. In Python erledigen Pydantic-Modelle das von Haus aus, ein guter Grund, im Generator diesen Stil zu wählen. In TypeScript lassen sich aus den erzeugten Interfaces Prüfungen mit Bibliotheken schreiben, die Daten zur Laufzeit kontrollieren. In C#, Java und Kotlin markierst du Felder, die vorhanden sein müssen, als required und lässt den Serializer früh scheitern.

Checkliste vor dem Commit

  • Benenne den obersten Typ von Root in etwas Aussagekräftiges um, etwa Order.
  • Prüf jedes Feld mit dem Typ unknown, object, Any oder JsonElement und ersetze ihn durch den echten Typ.
  • Prüf Zahlen: Ist ein Preis wirklich ein double, oder sollte er für Geld ein Dezimaltyp sein?
  • Prüf Datumsangaben: Willst du sie als Text oder als Datumstyp mit bekannter Zeitzone?
  • Entscheide, welche optionalen Felder wirklich optional sind und welche im Beispiel nur zufällig fehlten.
  • Führ Typen zusammen, die der Generator nur deshalb getrennt hat, weil sich ihre Beispiele leicht unterschieden.

Schritt für Schritt

  1. JSON-Antwort einfügenFüge die Antwort deiner API ein oder öffne eine .json-Datei. Eine Liste mit mehreren Einträgen liefert bessere Ergebnisse.
  2. Sprache wählenWähle TypeScript, C#, Python, Go, Java oder Kotlin und dann den Stil, etwa record, dataclass oder Pydantic.
  3. Obersten Typ benennenErsetze Root im Feld Name des obersten Typs durch den Namen, den dein Projekt nutzt, zum Beispiel Order.
  4. Kopieren und prüfenKopiere den Code oder lade ihn herunter und geh dann die Checkliste in dieser Anleitung durch.

Häufige Fragen

Kann ich Typen auch aus einem JSON Schema erzeugen?

Dieses Tool arbeitet mit JSON-Daten, nicht mit einem Schema. Veröffentlicht deine API ein JSON Schema oder eine OpenAPI-Datei, liefert ein schemabasierter Generator genauere Ergebnisse, weil das Schema angibt, was Pflicht ist.

Warum ist ein Feld in meinem TypeScript-Interface optional?

Mindestens ein Eintrag in deinem Beispiel hatte diesen Schlüssel nicht. Ist er in echten Daten immer vorhanden, entferne das Fragezeichen oder ergänze das Beispiel um einen vollständigen Eintrag.

Sollte Geld ein double sein?

Für Berechnungen mit Geld vermeidet ein Dezimaltyp wie decimal in C# oder BigDecimal in Java Rundungsfehler. Ein Generator sieht nur eine Zahl mit Dezimalpunkt, also ändere den Typ selbst.

Was passiert mit Schlüsseln mit Leerzeichen oder Bindestrichen?

Sie werden in jeder Sprache in gültige Namen umgewandelt, und der ursprüngliche Schlüssel bleibt in einem Attribut, Tag oder Alias erhalten. In TypeScript wird der Schlüssel einfach in Anführungszeichen gesetzt.

Wird mein JSON hochgeladen, wenn ich hier Code erzeuge?

Nein. Der Generator läuft in deinem Browser, Antworten mit privaten Daten bleiben also auf deinem Gerät.