JSON-zu-Go-Struct-Konverter
Fügen Sie ein JSON-Objekt (oder ein JSON-Array) ein, um automatisch die entsprechenden Go-Struct-Definitionen mit json-Tags zu erzeugen.
JSON in Go-Strukturen überführen
Wer eine API-Antwort in Go entgegennehmen will, muss eine zum JSON passende Struktur samt ihren json-Tags schreiben. Bei einer Handvoll Felder ist das keine Mühe, doch **sobald die Verschachtelung tiefer wird, gerät das Abschreiten der Ebenen unter gleichzeitigem Erfinden von Typnamen selbst zur Arbeit.** Dieses Werkzeug erzeugt den gesamten Satz an Definitionen einschließlich der verschachtelten Strukturen allein aus dem JSON, das Sie einfügen.
**Denken Sie allerdings daran, dass dabei ein aus einer einzigen Stichprobe erschlossener Typ herauskommt.** Schlüssel, die darin nicht vorkamen, fehlen naturgemäß, und jedes Feld, dessen Wert `null` war, wird zu `interface{}`, da Go keinen entsprechenden nullbaren Grundtyp kennt. Sind alle Elemente eines Arrays Objekte, werden deren Schlüssel zu einer Struktur zusammengeführt, und **die nur in manchen Elementen vorhandenen erhalten `omitempty`.** Die Ausgabe zu einer produktiv nutzbaren Struktur zu machen, setzt voraus, dass Sie diese Vermutungen an der tatsächlichen Schnittstellenbeschreibung prüfen und berichtigen.
So wandeln Sie um
- Fügen Sie das JSON ein Ein Objekt taugt ebenso wie ein Array; eine API-Antwort können Sie genau so einsetzen, wie sie eintraf.
- Benennen Sie den Wurzeltyp Er heißt zunächst `Root`. **Die Namen der verschachtelten Typen ergeben sich von selbst, indem jeder Eigenschaftsname in Pascal-Schreibweise überführt wird.**
- Sehen Sie die erzeugten Strukturen durch Die Definitionen erscheinen in der Reihenfolge der Ebenen, die json-Tags bereits gesetzt.
- Kopieren Sie sie und arbeiten Sie sie nach Lassen Sie `gofmt` darüberlaufen und gehen Sie dann die Stellen an, die zu `interface{}` wurden oder Zeiger sein sollten, nach der wirklichen Beschreibung.
Tipps für die Nutzung
- Sind alle Elemente eines Arrays Objekte, werden ihre Schlüssel zu einem einzigen Struct zusammengeführt. Schlüssel, die in manchen Elementen fehlen, erhalten automatisch das json-Tag `omitempty`.
- Der Name des Wurzeltyps ist standardmäßig "Root", kann aber beliebig geändert werden. Struct-Namen für verschachtelte Objekte werden automatisch erzeugt, indem der Property-Name in PascalCase umgewandelt wird.
- Ein JSON-null wird als `interface{}` ausgegeben, da Go keinen nativen nullfähigen primitiven Typ kennt. Für eine strengere Behandlung sollte ein Pointer-Typ in Betracht gezogen werden.
- Die Ausgabe ist ein leicht spaltenausgerichteter Entwurf. Wird sie nach dem Einfügen durch `gofmt` geschickt, richtet sich der Code am Standardstil des Projekts aus.
- Fügen Sie eine Beispiel-JSON-Antwort Ihrer API unverändert ein, um schnell einen Entwurf des Antwort-Structs für Ihren Go-Code zu erhalten.
Wofür Sie es nutzen können
Beim Beginn eines API-Clients
Die Beispielantwort aus der Dokumentation eingefügt, haben Sie sogleich einen Entwurf der empfangenden Struktur.
Beim Einlesen einer Konfigurationsdatei
Liegen die Einstellungen als JSON vor, lässt sich deren Aufbau unmittelbar in einen Typ übertragen.
Beim Entziffern einer fremden Schnittstellenbeschreibung
**Tief verschachteltes JSON wird weit begreiflicher, sobald es als Satz von Strukturen ausgebreitet vorliegt.**
Beim Vorbereiten von Testdaten
Leitet man die Typen zuerst aus einer echten Antwort ab, sinkt die Gefahr eines Fehlgriffs beim späteren Schreiben von Attrappen.
Begriffe der Typzuordnung in Go
- Struktur
- Der Typ in Go, der mehrere Felder zusammenfasst. Er entspricht einem Objekt im JSON.
- Json-Tag
- Die hinter einem Feld stehende Anmerkung in der Form `json:"user_id"`, die **dem Kodierer mitteilt, wie der Go-Feldname zum JSON-Schlüssel passt.**
- Omitempty
- Eine Angabe im json-Tag, die **das Feld aus der Ausgabe nimmt, wenn sein Wert der Nullwert ist.** Sie bedeutet nicht, dass das Feld null aufnehmen darf — ein Unterschied, den man sich merken sollte.
- Interface{}
- Ein Typ, der jeden Wert aufnimmt. JSON-Nullwerte und Felder mit wechselndem Typ landen hier, was ihn **zu einem brauchbaren Merkzeichen für die nach der Erzeugung zu prüfenden Stellen macht.**
- Pascal-Schreibweise
- Die Gepflogenheit, jedes Wort groß zu beginnen, wie in `UserId`. In Go **trägt dieser große Anfangsbuchstabe zugleich die Bedeutung, aus dem Paket heraus sichtbar zu sein.**
- Zeigertyp
- Ein als `*string` geschriebener Typ. Zu ihm greift man, wenn das Fehlen eines Wertes von der leeren Zeichenkette unterschieden werden muss.
Häufig gestellte Fragen
Übrigens – warum Go Structs mit json-Tags kombiniert
Go ist eine statisch typisierte Sprache, und beim Arbeiten mit JSON verlässt sich das Paket `encoding/json` der Standardbibliothek auf die Zuordnung zwischen Struct-Feldern und ihren json-Tags, um Daten zu kodieren und zu dekodieren. Einen Struct für die Antwortstruktur einer externen API von Hand zu schreiben, ist eine sich wiederholende Aufgabe, die mit jedem hinzugefügten Feld wächst, und sie taucht in vielen Go-Projekten immer wieder auf.
Dieses Tool analysiert die Struktur eines Beispiel-JSONs und generiert automatisch die passenden Struct-Definitionen samt json-Tags, wodurch diese Wiederholungsarbeit reduziert wird. Ein bekanntes Tool im selben Bereich ist quicktype, das die Umwandlung in Typen mehrerer Sprachen unterstützt; wer aber einfach nur eine Beispiel-API-Antwort einfügen und schnell einen Go-Struct erhalten möchte, profitiert von der Einfachheit eines auf genau diese Aufgabe fokussierten Tools.
Da Go keine Sprachfunktion besitzt, um ein Struct-Feld optional zu machen, ist es üblich, bei JSON-Feldern, die fehlen könnten, entweder `omitempty` zum json-Tag hinzuzufügen oder einen Pointer-Typ (wie `*string`) zu verwenden, um einen Nullwert von "kein Wert vorhanden" zu unterscheiden. Der generierte Struct ist lediglich eine mechanische Ableitung aus der Struktur – Nullable-Verhalten und künftige API-Änderungen sollten daher anhand der tatsächlichen Spezifikation manuell überprüft und angepasst werden, was gängige Praxis ist.