YamlBox

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

Durchsuchen Sie die vollständige Liste der 19-Tools

Weitere Artikel zum Lesen

Alle 19 Beiträge →