MiServe DevTools

Ihre Sticker

Heften Sie hier Tools an. Sie werden in diesem Browser gespeichert.

JSON in Go-Structs und TypeScript-Typen

Erzeugen Sie aus einem JSON-Beispiel Go-Structs, TypeScript-Interfaces oder -Typen oder ein JSON Schema, mit Erkennung optionaler Schlüssel, null und Datums-/Zeitwerten.

Läuft in Ihrem Browser. Nichts, was Sie einfügen, wird hochgeladen.

Über dieses Tool

Was aus dem Beispiel abgeleitet wird

Das Tool durchläuft den JSON-Wert und hält fest, was es an jeder Position findet. Die Elemente eines Arrays werden zu einer gemeinsamen Beschreibung zusammengeführt: Ein Schlüssel, der in einigen Objekten fehlt, wird optional, ein Wert, der manchmal null ist, wird nullable, und ein Array mit Werten unterschiedlicher Art wird in TypeScript zu einem Union-Typ und in Go zu []any.

Eine Zahl gilt nur dann als Ganzzahl, wenn sie im Beispiel überall ohne Dezimalpunkt und Exponent geschrieben ist und in einen vorzeichenbehafteten 64-Bit-Integer passt; andernfalls ist sie eine Gleitkommazahl. Ein String wird nur dann zu einem Datums-/Zeitwert, wenn er im Beispiel überall ein RFC-3339-Zeitpunkt wie 2026-11-14T10:00:00Z ist. Ein Datum ohne Uhrzeit bleibt ein String.

Jedes verschachtelte Objekt erhält einen Typ, der nach seinem Schlüssel benannt ist. Für die Elemente eines Arrays wird der Name in den Singular gesetzt, wenn der Schlüssel ein einfacher englischer Plural ist: users ergibt User und categories ergibt Category; andernfalls wird Item angehängt. Mit Verschachtelte Typen inline werden die verschachtelten Objekte stattdessen direkt in ihren übergeordneten Typ geschrieben.

Die Go-Ausgabe

Feldnamen werden exportiert und folgen der Go-Konvention für Initialismen, sodass user_id zu UserID und html_url zu HTMLURL wird, während der json-Tag den ursprünglichen Schlüssel behält. Ganzzahlen werden zu int, oder zu int64, wenn ein Wert im Beispiel nicht in 32 Bit passt, denn laut Go-Spezifikation darf int 32 Bit breit sein. Andere Zahlen werden zu float64 und Datums-/Zeitwerte zu time.Time. Der Unterschied zwischen 1 und 1.0 ist wichtig: encoding/json weigert sich, 1.0 in ein int-Feld zu dekodieren.

Ist omitempty für optionale Felder aktiviert, bekommt ein Schlüssel, der in manchen Objekten des Beispiels fehlt, omitempty in seinen Tag und behält seinen einfachen Typ. Ein Skalar oder Struct, der null sein kann, wird zu einem Pointer wie *string, damit null und der Nullwert unterscheidbar bleiben; Slices und Maps brauchen keinen Pointer, weil sie nil sein können. Ein Wert, der immer nur null ist, wird zu any. Optionale verschachtelte Structs und optionale time.Time-Felder werden ebenfalls zu Pointern, weil omitempty einen Struct-Wert nie weglässt. Die Spalten werden so ausgerichtet, wie gofmt sie ausrichtet.

Manche Schlüssel lassen sich an kein Struct-Feld binden. Kein json-Tag kann einen leeren Schlüssel benennen oder einen, der ein Komma, ein Anführungszeichen oder einen Backslash enthält. Das ursprüngliche encoding/json ignoriert außerdem einen Tag-Namen, der etwas anderes als Buchstaben, Ziffern und gängige Satzzeichen enthält, sodass ein Schlüssel mit einem kombinierenden Zeichen oder einem Emoji nur von der Implementierung auf Basis von encoding/json/v2 zugeordnet wird. Enthält das Beispiel solche Schlüssel, listet das Tool sie unter der Ausgabe auf.

Die TypeScript- und JSON-Schema-Ausgabe

In TypeScript wird ein optionaler Schlüssel mit ?: geschrieben, ein Wert, der null sein kann, mit | null, und ein Schlüssel, der kein gültiger Bezeichner ist, steht in Anführungszeichen. Datums-/Zeitwerte werden als string typisiert, weil JSON.parse genau das liefert, und durch einen Kommentar gekennzeichnet. Interface und Type-Alias beschreiben dieselbe Struktur; wählen Sie die Form, die Ihre Codebasis verwendet.

Die JSON-Schema-Ausgabe folgt Draft 2020-12. Schlüssel, die in jedem Objekt des Beispiels vorkommen, stehen unter required, Ganzzahlen sind integer, Datums-/Zeitwerte tragen format: date-time, und benannte Objekttypen stehen unter $defs und werden mit $ref referenziert.

Ein Beispiel zeigt, wie ein einzelnes Dokument aussah, nicht alles, was eine API senden kann. Prüfen Sie optionale Felder und Felder, die null sein können, anhand der API-Dokumentation, bevor Sie sich auf das Ergebnis verlassen.

Fragen

Woran erkennt das Tool, dass ein Feld optional ist?

Das lässt sich nur an Arrays ablesen. Haben die Objekte eines Arrays nicht alle dieselben Schlüssel, ist jeder Schlüssel optional, der in mindestens einem davon fehlt. Ein einzelnes Objekt liefert keinen Anhaltspunkt, deshalb gelten alle seine Schlüssel als erforderlich.

Warum ist eine Zahl ein int und eine andere ein float64?

Eine Zahl wird als Ganzzahl typisiert, wenn sie im Beispiel überall ohne Dezimalpunkt und Exponent geschrieben ist und in einen 64-Bit-Integer passt. In Go ist das int, oder int64, wenn ein Wert außerhalb des 32-Bit-Bereichs liegt. Ist ein einziger Wert 2.5 oder als 1.0 geschrieben, wird das Feld in Go zu float64 und in JSON Schema zu number. TypeScript verwendet für all das number.

Was passiert, wenn ein Wert null ist?

Hat dasselbe Feld auch einen Wert ungleich null, wird der Typ nullable: in Go ein Pointer oder ein Slice bzw. eine Map, die ohnehin nil sein können; in TypeScript eine Union mit null; in JSON Schema ein Schema, das zusätzlich null akzeptiert. Ist null der einzige Wert, ist über den tatsächlichen Typ nichts bekannt, und das Ergebnis ist any in Go und null in TypeScript und JSON Schema.

Wird mein JSON an einen Server gesendet?

Nein. Die Typen werden per JavaScript in Ihrem Browser-Tab erzeugt. Das Tool stellt mit dem, was Sie einfügen, keine Netzwerkanfrage, und die Sicherheitsrichtlinie der Website blockiert Anfragen an alle anderen Hosts.

Weitere Tools in Daten