Command Palette

Search for a command to run...

So ordnen Sie JSON mit Feldtags den Go-Strukturen zu

So ordnen Sie JSON mit Feldtags den Go-Strukturen zu

T
Toolz Team
|Aug 31, 2026|16 min lesen
Bevorzugen Sie Toolz.dev bei Google

Teil der Sammlung Datenwerkzeuge

JSON zu Go Struct

Konvertieren Sie JSON in Go-Strukturdefinitionen mit json-Tags Verschachtelte Objekte werden zu Inline-Strukturen, Arrays von Objekten werden zusammengeführt und Feldnamen folgen Go-Konventionen Leitet clientseitig aus.

Verwenden Sie die JSON zu Go Struct

Der größte Teil meines Tagesjobs besteht aus TypeScript und PHP, aber ein guter Teil des Tools dahinter Toolz.dev Und die kleinen Dienste, die ich drum herum schreibe, sind Go, und jedes Mal, wenn ich einen neuen API-Client verkabele, treffe ich auf dieselbe WandSie haben eine JSON-Antwort vor sich, und Sie brauchen die Go-Struktur, die json.Unmarshal Wird es entschlüsseln In diese Struktur von Hand zu schreiben ist mühsam auf eine ganz bestimmte Art und Weise: es ist nicht schwer, es ist nur fummelig, und die fummeligen Bits sind genau dort, wo man Fehler macht Also habe ich einen Konverter in die Seite eingebaut, und das ist die Anleitung dazu.

tl; dr: Der Toolz JSON-Go-Strukturkonverter Analysiert ein JSON-Dokument und gibt die Go-Typdeklarationen aus, die es beschreiben Objekte werden zu Inline-Strukturen, Arrays von Objekten werden zu einer Struktur zusammengeführt, und jedes Feld erhält eine json:"key" Tag also encoding/json Karten der Daten korrekt zurück Feldnamen folgen Go-Konventionen, also id wird ID und user_url wird UserURL. Ganzzahlen auf umschalten int64Hinzufügen omitempty, und den Root-Typ umbenennen Es läuft vollständig clientseitig: kein Upload, kein Signup, funktioniert offline.

Was ist ein JSON to Go Struct Konverter?

Ein JSON-Go-Strukturkonverter verwandelt ein JSON-Dokument in die Go-Typ-Deklarationen, die es beschreiben, sodass Sie dieselben Daten mit der Standardbibliothek & #39; dekodieren können. s encoding/json Paket statt die Struktur von Hand einzugeben Jedes JSON-Objekt wird zu einer Go-Struktur, jedes Feld trägt eine json:"key" Tag, der es auf den ursprünglichen Namen zurückbildet, und aus den Werten werden die Skalartypen abgeleitet Eine JSON-Zeichenfolge wird stringEine ganze Zahl wird intEine Zahl mit einem Dezimalpunkt wird float64, true und false Werden bool, und null wird interface{}drohen

Der Grund, warum das nützlich ist, ist, dass ein JSON-Objekt und eine Go-Struktur die gleiche Form beschreiben, eine Menge benannter Felder mit typisierten Werten, aber Go ist statisch typisiert und JSON nicht, also muss die Struktur jeden Typ vorne buchstabieren. Das Ableiten dieser Typen aus einer Beispielantwort ist reine Mechanik, und die Mechanik, die von Hand über eine verschachtelte Nutzlast durchgeführt wird, ist der Ort, an dem die Fehler leben. Der Konverter führt die Ableitung deterministisch durch und gibt Ihnen einen Typblock zurück, der kompiliert.

Es lohnt sich, sich über die beiden Hälften des Problems im Klaren zu sein, denn sie sind das, was ein naiver Konverter falsch macht Die erste ist die Benennung: Go kodiert nur exportierte Felder, die mit einem großen Anfangsbuchstaben, und die Community-Lint-Regeln wollen gemeinsame Initialismen vollständig groß geschrieben haben Die zweite ist das Tag: die json:"..." Tag muss den genauen Originalschlüssel bzw json.Unmarshal Überspringt zur Laufzeit stumm und fehlerfrei das Feld, eins falsch machen und dein Dekodier ergibt eine Struktur voller Nullwerte, während alles gut aussieht Beides erledigt das Tool für dich.

Warum nicht den Struct von Hand schreiben?

Das ist die ehrliche Frage, denn für ein flaches Dreifeldobjekt ist das Handschreiben der Struktur schneller als das Öffnen eines Werkzeugs Der Konverter verdient seinen Platz an den Antworten, die nicht flach sind: eine Nutzlast mit verschachtelten Objekten, Arrays von Objekten und zwanzig Feldern, in denen die Hälfte der Schlüssel liegt snake_case Und ein paar sind Initialismen wie id, url, und api_keydrohen

Auf so eine Antwort hat die handgeschriebene Version drei Fehlermodi, die ich wiederholt getroffen habe Man vergisst ein Feld zu exportieren, also bleibt es klein und encoding/json Weigert sich, es zu bevölkern. Du großschreibst das Feld, vergisst aber das Etikett, also UserName Sucht nach einem JSON-Schlüssel namens UserName Und findet nie user_nameOder man bekommt das Nesting falsch, deklariert ein Feld als einfache Struktur, wenn das JSON es tatsächlich in ein Array wickelt Keiner davon sind Kompilierungsfehler Es sind Laufzeitüberraschungen, die sich als fehlende Daten zeigen, und man verliert mehr Zeit beim Debuggen einer davon, als man mit der Generierung der ganzen Struktur verbracht hätte.

Der Konverter entfernt alle drei Er exportiert jedes Feld, er schreibt das Tag aus dem echten Schlüssel, und er liest die tatsächliche JSON-Form, um zwischen einem Struct und einem Slice von Structs zu entscheiden Was Sie einfügen, ist, wofür Sie Typen erhalten.

Hier die Entscheidung in einer Tabelle.

Situation einsetzen wieso
Ein flaches Objekt mit zwei oder drei Feldern Schreiben Sie es von Hand Schneller als etwas zu öffnen
Eine verschachtelte API-Antwort mit vielen Feldern JSON-Go-Strukturkonverter Beim Namen und Tags brechen handgeschriebene Strukturen
Sie benötigen die gleiche Form wie TypeScript JSON-zu-TypeScript-Konverter Gleiche Schlussfolgerung, andere Zielsprache
Sie möchten ein Validierungsschema, keine Typen JSON-Schemagenerator Draft-07-Regeln statt Go-Typen

Warum unterscheiden sich die Go-Feldnamen von meinen JSON-Schlüsseln?

Dies bringt die Leute beim ersten Mal auf den Punkt, daher lohnt es sich zu erklären, anstatt sich zu verstecken. Go's encoding/json Pauschal nur Marshals und Unmarshals Ausfuhr ausgeführt Felder strukturieren, das heißt Felder, deren Name mit einem Großbuchstaben beginnt Eine JSON-Taste wie user_name Kann nicht auf einen Nicht-Exported abgebildet werden user_name Feld, also muss das Feld in etwas Exportiertes umbenannt werden Das Werkzeug aktiviert jedes Wort und dreht sich user_name in UserNamedrohen

Darüber hinaus ist die Go-Community's Fusselwerkzeuge, die Regeln, die mit begannen golint Und weiterleben in Werkzeugen wie staticcheckWill gemeinsame Initialismen in Großbuchstaben geschrieben. Also id wird ID, nicht Id;;; user_url wird UserURL, nicht UserUrl; Und html_body wird HTMLBody. Der Konverter kennt den Standardsatz von Initialismen, die ID, URL, API, HTTP, JSON, UUID, und den Rest, und wendet sie an, so dass die Ausgabe die Linters passiert, die Ihr CI wahrscheinlich ausführt.

Das Stück, das die Umbenennung sicher macht, ist das Tag Jedes Feld bekommt ein json:"user_name" Tag, der die Originaltaste genau hält, also zur Laufzeit json.Unmarshal Liest die JSON-Taste user_name und schreibt es in die UserName Feld unabhängig vom Umnamen Der Go blog' s-Artikel auf JSON und Go dokumentiert diesen Tag-Mechanismus, und es ist der Grund, warum ein umbenanntes Feld immer noch korrekt dekodiert Ohne das Tag würde die umbenannte Struktur stillschweigend nicht populieren.

Wie werden Zahlen und Arrays von Objekten gehandhabt?

Zwei Teile der Schlussfolgerung verdienen eine genauere Betrachtung, da sich die Qualität der Konverter darin unterscheidet.

Zahlen zuerst JSON hat einen einzelnen Zahlentyp, Go jedoch nicht, so dass das Werkzeug wählen muss Ein Wert ohne Bruchteil wird int, oder int64 Wenn Sie diese Option einschalten, wird ein Wert mit einer Dezimalstelle float64. Der interessante Fall ist ein Array, das sie mischt, wie [9.5, 8, 7.2]. Wenn das Tool das als eingegeben hat []int Es würde nicht gelingen, das zu dekodieren 9.5„So erweitert es die gesamte Scheibe auf []float64. Jedes Array, bei dem ein Element einen breiteren Typ erzwingt, erhält den breiteren Typ für alle Elemente, was die einzige Wahl ist, die jeden Wert dekodiert.

Arrays von Objekten sind der andere Ort, an dem echte Nutzlasten interessant werden Eine API gibt Ihnen fast nie ein Array, in dem jedes Objekt einen identischen Satz von Schlüsseln hat; ein Element hat ein Feld, das die anderen weglassen, oder ein nullbares Feld ist hier vorhanden und fehlt dort Wenn das Werkzeug eine Struktur nur aus dem ersten Element generiert, würde es die Schlüssel fallen lassen, die später erscheinen Stattdessen führt es jedes Objekt im Array in eine Struktur zusammen, die jeden Schlüssel enthält, den jedes Element hat Und wenn zwei Elemente den gleichen Schlüssel ergeben, sind inkompatible Typen, sagen wir eine Zahl in einem und eine Zeichenfolge in einem anderen, fällt dieses Feld zurück auf interface{} Anstatt dass das Tool falsch tippt oder direkt ausfällt Das Ergebnis ist ein einzelner Strukturtyp, der das gesamte Array dekodieren kann.

Wie verwende ich den Konverter?

Der Ablauf beträgt vier Schritte Einfügen eines JSON-Objekts oder Arrays in das Eingabefeld; wenn Sie zuerst die Form der Ausgabe sehen möchten, laden Sie das Sample Geben Sie dem Stammtyp einen Namen, etwa wie User oder ApiResponseUnd das Tool reinigt es in eine gültige exportierte Go-Kennung, sodass es wie geschrieben kompiliert. Wählen Sie int oder int64 Für ganze Zahlen, und schalten Sie ein omitempty Wenn Sie nullwertige Felder weglassen möchten, wenn die Struktur später wieder in JSON codiert wird, klicken Sie dann auf Konvertieren und kopieren Sie die Struktur in Ihre .go Akte

Wenn der JSON ungültig ist, meldet das Tool die eigene Fehlermeldung von parser' anstatt stillschweigend zu scheitern, sodass ein Streuner-Nachlaufkomma oder ein nicht zitierter Schlüssel schnell gefunden werden kann. Und weil alles in Ihrem Browser ausgeführt wird, können Sie eine echte API-Antwort einfügen, einschließlich eines mit privaten Feldern, ohne dass Ihr Computer übrig bleibt. Dieses clientseitige Modell ist das gleiche hinter dem Rest der Website, beschrieben in der Datenschutz Online-Tools Führung.

Wie passt das zu den anderen JSON-Tools?

Der JSON to Go Strukturwandler ist ein Mitglied einer Familie von JSON Transformatoren auf der Website, und sie teilen sich den gleichen Parsing-Kern Wenn Sie zuerst den JSON aufräumen möchten, wird die JSON-Formater Einrückung vornehmen und validieren wird, was sich lohnt, bevor Sie konvertieren, damit Sie die Form lesen können, die Sie gerade eingeben Wenn Ihre Zielsprache TypeScript und nicht Go ist, wird die JSON-zu-TypeScript-Konverter Führt die gleiche Inferenz aus und gibt Schnittstellen aus, Wenn Sie anstelle von Sprachtypen einen Validierungsvertrag benötigen, wird die JSON-Schemagenerator Erstellt ein Draft-07-Schema, und wenn das Ziel eine PHP-Codebasis ist, wird die JSON-zu-PHP-Array-Konverter Schreibt ein Array-Literal.

Der Thread, der sie alle verbindet, ist, dass sie JSON als Strukturquelle behandeln und diese Struktur in das übersetzen, was auch immer Ihre Codebasis spricht Wenn Sie über mehrere Sprachen hinweg arbeiten, wird die Webentwickler-Toolkit Zusammenfassung zeigt, wie diese Teile zusammenpassen und wie Anleitung für die Coding-Tools Deckt den größeren Satz an Formatern und Konvertern ab.

Ein gearbeitetes Beispiel aus dem Aufbau eines Go-Dienstes

Lassen Sie mich das konkret machen Vor einiger Zeit schrieb ich einen kleinen Go-Dienst, der Daten von einer API eines Drittanbieters zog und eine abgespeckte Version davon neu freilegte Die Antwort von Vendor' war ein verschachteltes Objekt: ein Top-Level-Datensatz mit einem owner Unterobjekt, ein tags Zeichenfolgenanordnung und a scores Array, das je nach Feld ärgerlicherweise ganze Zahlen und Dezimalstellen vermischte. Das manuelle Tippen der Struktur bedeutete, dass man sich die owner Nisten Sie sich richtig ein und markieren Sie jeden snake_case Schlüssel und die Entscheidung, was mit diesem gemischten Array zu tun ist.

Ich habe die Beispielantwort in den Konverter eingefügt, den Root-Typ nach der Ressource benannt und eine Struktur mit zurückbekommen Owner Als Inline-Nested-Struktur Tags als []string, und Scores Richtig erweitert []float64drohen der id Feld herauskam als ID Mit einem json:"id" Tag, also ging es sowohl am Linter vorbei als auch dekodierte den echten Schlüssel, ich kopierte ihn direkt in das Client-Paket und ging weiter zur Logik, wo ich eigentlich meine Zeit verbringen wollteDie Struktur war nicht der interessante Teil der Arbeit, und sie zu generieren bedeutete, dass sie nicht mehr Teil der Arbeit war.

Der Grund, warum ich nach dem Konverter und nicht nach einer handgeschriebenen Struktur an diesen Stellen greife, ist nicht Faulheit, sondern, dass die mechanischen Teile, Export, Tagging und Nesting, genau die Teile sind, die ich falsch verstehe, wenn ich stattdessen an die Logik denke, Wenn ich sie auf ein deterministisches Tool auslade, bedeutet das, dass die Struktur auf dem ersten Kompilat korrekt ist, und eine korrekte Dekodierung auf dem ersten Lauf, was auf einer verschachtelten Nutzlast eine echte Debugging-Sitzung spart Wenn ich die Struktur brauche, um auch die Neukodierung zu überleben, schalte ich ein omitempty Die Nullwerte bleiben also außerhalb der Ausgabe und die Tags kommen als durch json:"key,omitempty" Bereit für diese Hin- und Rückfahrt.

Worin bestehen die wissenswerten Grenzen?

Ein paar ehrliche Kanten Die erste ist null. EIN JSON null Keine Typinformationen für sich trägt, so ein Feld, das ist null In Ihrer Probe wird als eingegeben interface{}. Da kann das Tool nichts ableiten; wenn Sie den realen Typ kennen, ändern Sie ihn in Ihrem Editor, nachdem Sie ihn eingefügt haben, oder füttern Sie den Konverter mit einem Sample, wo dieses Feld einen realen Wert hat, damit der Typ abgeleitet werden kann Dies ist eine Eigenschaft der Daten, kein Mangel des Tools.

Die zweite ist numerische Präzision, und es ist eine Eigenschaft von JSON-Parsing im Allgemeinen und nicht speziell dieser Konverter Das Tool analysiert Ihren JSON mit dem Browser's JSON-Parser, der Zahlen als Floats mit doppelter Genauigkeit darstellt, sodass Ganzzahlen jenseits von etwa 2 bis zur 53. Potenz zur Analysezeit an Genauigkeit verlieren, bevor das Tool sie jemals sieht. Die generierten int64 Feld ist breit genug, um Halten Eine große ID, aber wenn die ID als nackte JSON-Nummer so groß ankommt, hat die Analyse sie bereits abgerundet. Bei wirklich großen ganzzahligen IDs besteht der robuste Zug darin, sie als Zeichenfolgen im JSON zu tragen, wodurch sie genau bleiben und Sie das Feld als eingeben können stringdrohen

Drittens ist die Schlussfolgerung ein Ausgangspunkt, kein Evangelium. Das Tool gibt Ihnen die Typen an, die die Stichprobe unterstützt, aber nur Sie wissen, dass ein Feld, das zufällig eine ganze Zahl in dieser Antwort ist, wirklich eine nullbare Zahl ist oder dass a float64 Ein sein soll json.Number Präzisionsverluste zu vermeiden Behandeln Sie die Ausgabe als einen korrekten ersten Entwurf, den Sie verfeinern, nicht als einen in Stein gemeißelten Vertrag Das gilt für jeden JSON-zu-Typen-Generator, in jeder Sprache.

Schließlich erzeugt der Konverter verschachtelte Inline-Strukturen, die die gesamte Form in einer Deklaration beibehalten, die Sie als Block einfügen können. Das ist der gebräuchlichste und am besten lesbare Stil für eine generierte Struktur, und die Tools im Go-Ökosystem haben ihn populär gemacht. Wenn Sie lieber separate benannte Typen für tief wiederverwendete Unterobjekte hätten, handelt es sich um einen Refaktor, den Sie von Hand erstellen, sobald sich die Inline-Version in Ihrem Editor befindet, und normalerweise handelt es sich um einen Fünf-Sekunden-Extrakt mit Ihrer IDE.

Häufig gestellte Fragen

Was ist ein JSON to Go Struct Konverter? Ein JSON to Go-Strukturkonverter transformiert ein JSON-Dokument in die Go-Typdeklarationen, die es beschreiben Jedes Objekt wird zu einer Struktur, jedes Feld erhält ein json: & quot; key" Tag, und die Werttypen werden abgeleitet, sodass Sie dieselben Daten mit Codierung/json unmarshalen können, ohne die Struktur von Hand zu schreiben.

Wie konvertiere ich JSON in eine Go-Struktur? Fügen Sie Ihren JSON in das Eingabefeld ein, geben Sie einen Namen für den Root-Typ ein, wählen Sie Ihre Ganzzahl - und Tag-Optionen, dann klicken Sie auf Konvertieren Das Tool druckt Go-struct-Definitionen mit json-Tags, die Sie direkt in eine 'go-Datei kopieren können.

Warum unterscheiden sich die Go-Feldnamen von meinen JSON-Schlüsseln? Go kodiert nur exportierte Felder, daher wird jeder Feldname großgeschrieben und gemeinsame Initialismen werden groß geschrieben, um sie an Golint anzupassen. Das json:"..." Das Tag auf jedem Feld behält den Originalschlüssel, sodass json.Unmarshal die Daten trotz des umbenannten Felds immer noch korrekt abbildet.

Wie werden JSON-Nummern den Go-Typen zugeordnet? Eine ganze Zahl wird zu int, oder int64, wenn Sie diese Option aktivieren, und eine Zahl mit einem Dezimalpunkt wird zu float64. Wenn ein Array ganze Zahlen und Dezimalstellen für dieselbe Position mischt, wird der Typ zu float64 erweitert, sodass jeder Wert passt.

Wie werden Arrays von Objekten gehandhabt? Ein Array von Objekten wird zu einer einzigen Struktur zusammengeführt, die jeden Schlüssel enthält, den ein beliebiges Element hat. Wenn zwei Elemente dieselben Schlüsselinkompatiblen Typen ergeben, wird dieses Feld zur Schnittstelle {}, sodass die Struktur immer noch das gesamte Array abdeckt.

Was passiert mit Nullwerten? Ein JSON null gibt keine Typinformationen für sich allein, daher wird das Feld als Schnittstelle {} eingegeben, wenn Sie den realen Typ kennen, ändern Sie ihn in Ihrem Editor nach dem Einfügen, oder geben Sie einen nicht-null Beispielwert im JSON an, damit der Typ abgeleitet werden kann.

Wird mein JSON irgendwo hochgeladen? Nein. Die Konvertierung erfolgt vollständig in Ihrem Browser mit JavaScript auf Ihrem Gerät. Ihr JSON wird nie hochgeladen, protokolliert oder gespeichert und das Tool arbeitet weiterhin mit dem Netzwerk, das nach dem Laden der Seite getrennt wurde.

Ist der JSON to Go Struct-Konverter kostenlos? Ja. Es ist völlig kostenlos ohne Anmeldung, ohne Wasserzeichen und ohne Nutzungsobergrenze Konvertieren Sie so viele JSON-Dokumente in Go-Strukturen, wie Sie für persönliche oder kommerzielle Projekte benötigen.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!