Codegeneratoren · 5 Min. gelesen
JSON to Go: Strukturiert das Unmarshalieren beim ersten
Go lässt Sie die Form des JSON aufschreiben, das Sie dekodieren, und der Compiler hält Sie daran fest. Eine JSON to Go-Konvertierung aus einer echten Antwort macht sowohl das Tippen als auch das Rätselraten überflüssig: Feldnamen, `json`-Tags und verschachtelte Typen kommen korrekt an, und Sie können direkt zu dem Teil des Programms gehen, der tatsächlich etwas tut.
Aktualisiert
Die generierte Form
Ein Konverter wandelt jedes JSON-Objekt in eine Struktur, jedes Array in ein Slice um und leitet pro Wert einen Go-Typ ab. Verschachtelte Objekte werden zu benannten Typen und nicht zu anonymen Blobs, wodurch die Signatur Ihres Decodierungscodes lesbar bleibt:
type Container struct {
Name string `json:"name"`
Image string `json:"image"`
Ports []struct {
ContainerPort int `json:"containerPort"`
} `json:"ports"`
}
Die `json`-Tags sind der wichtige Teil. Der Go-Decoder berücksichtigt beim Abgleich von Feldnamen die Groß-/Kleinschreibung, aber `containerPort` und `ContainerPort` werden ohne ein Tag nicht ausgerichtet, und jeder Schlüssel, der kein gültiger Go-Bezeichner ist – zum Beispiel `app.kubernetes.io/name` – kann ohne eins überhaupt nicht abgeglichen werden.
Zahlen, Nullen und die beiden klassischen Fallen
- Zahlen – Inferenz ergibt `int` für ganze Werte, aber JSON hat keinen ganzzahligen Typ. Ein Feld, das heute `3` kostet, kann morgen `3.5` sein, daher sind Ausweise und Geld je nach Bedarf sicherer als `float64`, `string` oder `json.Number`.
- Nullen – ein Schlüssel, der `null` sein kann, sollte ein Zeiger (`*string`) sein, damit Sie „abwesend“ von „leer“ unterscheiden können.
- Zeitstempel – eine RFC 3339-Zeichenfolge wird sauber in `time.Time` dekodiert; Bei einer Unix-Epochennummer ist dies nicht der Fall. Behalten Sie diese also bei `int64` und konvertieren Sie sie explizit.
- Unbekannte Felder – `json.Decoder` ignoriert standardmäßig Extras; Verwenden Sie `DisallowUnknownFields`, wenn Sie lieber laut scheitern möchten.
Generieren Sie nach Möglichkeit zwei oder drei Antworten. Felder, die manchmal fehlen, werden zu Hinweisen, und diese Entscheidung lässt sich viel einfacher anhand von Beweisen als aus dem Gedächtnis treffen.
Von der Struktur zum funktionierenden Code
Wenn die Strukturen vorhanden sind, umfasst die Dekodierung drei Zeilen und der Compiler erzwingt die Zugriffspfade von dort aus. Ein gängiges Muster besteht darin, in die generierte Struktur zu dekodieren und sie dann Ihrem Domänentyp zuzuordnen, sodass sich die JSON-Form ändern kann, ohne dass sie sich durch die Anwendung ausbreitet. Kennzeichnen Sie die generierte Datei mit dem Endpunkt, von dem sie stammt, und generieren Sie sie neu, wenn sich die Antwort ändert, anstatt sie manuell zu bearbeiten – handbearbeiteter generierter Code ist die Version, die niemand später neu generieren wagt.
Lokal generieren
Die Nutzlasten, aus denen sich Go-Strukturen generieren lassen, sind in der Regel echte API-Antworten, und echte Antworten enthalten Token und Kundendaten. Bei einer browserbasierten JSON-to-Go-Konvertierung bleibt die Nutzlast im Tab – kein Upload, keine Aufbewahrungsfrage – was die Generierung aus Produktionsdaten zu einem normalen Schritt und nicht zu einer Richtlinienausnahme macht.
JSON zum Mitnehmen – häufig gestellte Fragen
Warum dekodieren meine Go-Strukturen JSON nicht?
Feldnamen in JSON stimmen selten genau mit den exportierten Namen von Go überein, daher benötigt die Struktur `json`-Tags. Führen Sie eine Neugenerierung mit aktivierten Tags durch, bestätigen Sie die Schreibweise des Schlüssels einschließlich der Zeichensetzung und prüfen Sie, ob der Decoder unbekannte Felder zulassen soll.
Sollten generierte numerische Felder int oder float64 sein?
Verwenden Sie `float64` – oder `json.Number`, wenn es auf Präzision ankommt – für alles ab einem externen API, da JSON ganze Zahlen nicht von Dezimalzahlen unterscheidet. Reservieren Sie `int` für Werte, die Sie durchgehend kontrollieren.
Wie gehe ich mit einem Feld um, das manchmal null ist?
Machen Sie daraus einen Zeigertyp wie `*string`, der sowohl „Schlüssel fehlt“ als auch „Schlüssel vorhanden mit Nullwert“ kodiert und Ihnen dennoch ermöglicht, nach einem echten Wert zu suchen. Stattdessen werden Nicht-Zeigerfelder stillschweigend zu Nullwerten.
In diesem Beitrag erwähnte Tools
Weitere Artikel zum Lesen
6 Min. gelesen
JSON bis TypeScript: Typen, die der Realität entsprechen
Konvertieren Sie JSON- in TypeScript-Schnittstellen aus einer echten API-Antwort – optionale Schlüssel, Null-Unions, verschachtelte Typen – und verhindern Sie, dass generierte Typen driften.
5 Min. gelesen
JSON bis SQL: von einer Nutzlast zu einer Tabelle, die Sie
Konvertieren Sie JSON in SQL mit CREATE TABLE- und INSERT-Anweisungen, die aus einer echten Nutzlast generiert wurden, mit sinnvoller Typzuordnung, Escapezeichen und ehrlichen Grenzwerten.
6 Min. gelesen
JSON Formatierer: hübsch, minimiert und tatsächlich gültig
Ein JSON-Formatierer, der mit genauen Fehlerpositionen schön druckt, minimiert und validiert – plus die fünf Syntaxfehler, die fast jedem ungültigen JSON-Fehler zugrunde liegen.
- Längerer Artikel zum Lesen: JSON bis TypeScript: Typen, die die Wahrheit sagen