Zum Inhalt springen
Toova
Alle Werkzeuge

JSON zu TypeScript, Go, Python, PHP, Rust

Datenschutz by Design — läuft vollständig in Ihrem Browser

Die richtigen Typdefinitionen aus einer echten API-Antwort abzuleiten ist eine dieser Aufgaben, die fünf Sekunden dauern sollte, aber irgendwie fünfzehn Minuten frisst. Dieses Tool liest ein JSON-Beispiel in deinem Browser, läuft durch die Struktur und gibt idiomatische Typen für TypeScript, Go, Python, PHP oder Rust aus — mit optionalen Feldern, ISO-Datumserkennung und korrekter Integer-vs.-Float-Unterscheidung.

Wie die Inferenz funktioniert

Das Tool durchläuft den JSON-Baum einmal und baut eine Zwischenrepräsentation: Primitive werden zu string / int / float / bool / null, Arrays leiten den Elementtyp aus der Vereinigung ihrer Mitglieder ab und Objekte erzeugen eine Struktur, deren Feldtypen aus den Werten kommen. Erscheint ein Feld in einigen Array-Elementen, in anderen nicht, wird es als optional markiert — der erzeugte Typ kann unvollständige Daten dekodieren, ohne zu brechen. Zahlen ohne Nachkommastellen werden als int64 (Go) / int (Python) / i64 (Rust) ausgegeben, Zahlen mit Nachkommastellen als float64 / float / f64. Strings, die zu ISO 8601 (`2024-03-15T10:30:00Z`) passen, werden zu Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.

Ausgabestil pro Sprache

Jeder Emitter folgt den Konventionen seiner Zielsprache. TypeScript: exportierte Interfaces mit `?:`-Syntax. Go: Structs mit `json:`-Tags, optionale Felder als Pointer mit `omitempty`. Python: `@dataclass`, Pflichtfelder zuerst und `Optional[T] = None` am Ende (dataclass-Reihenfolge). PHP: final Klassen mit strikten Typen und `@var list<T>`-PHPDoc-Hinweisen für typisierte Arrays. Rust: Structs mit `#[derive(Serialize, Deserialize)]`, `Option<T>` für nullbare Felder und `#[serde(rename)]`, wenn der snake_case-Name in Rust vom JSON-Schlüssel abweicht.

Wann es einzusetzen ist (und wann nicht)

Der Generator löst die ersten 80 % der Arbeit: in Sekunden zu einer funktionierenden Typdefinition aus einem Payload kommen. Er ersetzt kein handgeschriebenes Schema, wenn du präzise Einschränkungen brauchst (Regex auf Strings, min/max auf Zahlen, diskriminierte Unions). Nutze die Ausgabe als Ausgangspunkt und ziehe die Typen anschließend enger. Die Erkennung optionaler Felder ist heuristisch — basierend auf dem, was im Beispiel vorhanden ist — also schick wenn möglich mehrere unterschiedliche Beispiele durch.

Häufig gestellte Fragen

Verlässt das JSON, das ich einfüge, meinen Browser?
Nein. Parser, Typinferenz und Codeausgabe laufen alle in JavaScript innerhalb deines Tabs. Öffne das Netzwerk-Panel während du erzeugst — du siehst null ausgehende Anfragen. Sicher für Produktions-Payloads mit echten Tokens und PII.
Warum ist mein Feld optional, obwohl es immer einen Wert hat?
Das Optional-Flag wird gesetzt, wenn ein Array Objekte mit und ohne dieses Feld enthält. Fügst du ein einziges Objekt ein, wird nichts optional. Fügst du ein Array identischer Objekte ein, ebenfalls nichts. Das Flag greift nur, wenn die Struktur innerhalb des Arrays variiert.
Wie werden Integer und Float unterschieden?
JSON hat nur einen numerischen Typ. Das Tool prüft jeden Wert und gibt int aus, wenn der Wert keine Nachkommastellen hat (`42`, `1000`), und float, wenn doch (`3.14`, `99.0`). Mischt ein Array beides, wird der Typ auf float erweitert, um verlustfreie Dekodierung zu vermeiden.
Erkennt es ISO-Datums-Strings?
Ja. Strings im Muster `YYYY-MM-DD` oder `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` werden als nativer Datums-/Zeit-Typ der Sprache ausgegeben (Date in TS, time.Time in Go, datetime in Python, DateTimeInterface in PHP, chrono::DateTime in Rust). Andere Datumsformate bleiben Strings.
Muss ich etwas installieren, um den erzeugten Code zu nutzen?
TypeScript-Ausgabe ist pur — keine Abhängigkeiten. Go-Ausgabe nutzt nur die Standardbibliothek (time.Time bei ISO-Daten). Python-Ausgabe verwendet das Standard-Dataclasses-Modul. PHP-Ausgabe nutzt native Typen. Rust-Ausgabe benötigt serde + chrono, wenn ISO-Daten vorkommen. Header/Imports werden bei Bedarf in die Ausgabe geschrieben.
Kann ich Typen für ein Array von Objekten als Wurzel erzeugen?
Ja. Wenn die Wurzel ein Array von Objekten ist, gibt das Tool eine Struktur für das Element aus und einen Top-Level-Typalias für das Array. Zum Beispiel produziert ein JSON `[{...}, {...}]` mit Namen `Users` ein `User`-Interface plus `type Users = User[];` in TypeScript oder `pub type Users = Vec<User>;` in Rust.