Kostenloser JSON-zu-Go-Struct-Konverter
Parsen Sie JSON und erzeugen Sie automatisch Go-Struct-Definitionen mit PascalCase-Feldnamen und json-Tags für eine reibungslose Integration in Ihren Go-Code.
Eingabe & Ausgabe
Optionen
So funktioniert es
- JSON einfügen: Geben Sie ein beliebiges JSON-Objekt oder eine verschachtelte Struktur in das Eingabefeld ein.
- Go-Struct erhalten: Die entsprechende Go-Struct-Definition mit korrekten Feldnamen, Typen und JSON-Tags wird sofort erzeugt.
- Kopieren und nutzen: Kopieren Sie den Struct-Code und fügen Sie ihn in Ihr Go-Projekt ein, um JSON-Daten zu deserialisieren.
Warum den JSON-zu-Go-Struct-Konverter nutzen?
Go-Structs für komplexe JSON-Antworten von Hand zu schreiben, ist mühsam und fehleranfällig, vor allem, wenn die API tief verschachtelte Objekte mit Dutzenden Feldern liefert. JSON to Go automatisiert das, indem es die JSON-Form analysiert und korrekt typisierte Go-Structs mit passenden json:"…"-Tags erzeugt, die zu den JSON-Feldnamen passen. Das beschleunigt die Go-Entwicklung beim Konsumieren von REST-APIs, beim Verarbeiten von Webhook-Payloads und beim Arbeiten mit jeder JSON-Datenquelle.
Funktionen
- Erzeugung verschachtelter Structs: Tief verschachtelte JSON-Objekte werden in verschachtelte Go-Struct-Definitionen umgewandelt.
- Typinferenz: Zeichenketten, Zahlen, Booleans, Arrays und null-Werte werden auf passende Go-Typen abgebildet.
- JSON-Tags: Alle Felder enthalten json:"fieldName"-Struct-Tags, die den ursprünglichen JSON-Schlüsseln entsprechen.
- Array-Behandlung: JSON-Arrays werden zu Go-Slices mit dem korrekten Elementtyp.
- Pointer-Typen: Nullable-JSON-Felder werden als Pointer-Typen dargestellt (z. B. *string).
Häufige Fragen
Wie werden null-Werte behandelt?
JSON-null-Felder werden in Go in Pointer-Typen (z. B. *string, *int) konvertiert, die sowohl nil als auch einen tatsächlichen Wert darstellen können. Damit werden optionale oder nullable Felder in der API-Antwort korrekt behandelt.
Was ist, wenn das JSON inkonsistente Typen hat?
Wenn dasselbe Feld in unterschiedlichen JSON-Objekten mit verschiedenen Typen erscheint (in echten APIs häufig), kann der Konverter interface{} (any im modernen Go) ableiten. Prüfen Sie diese Felder und ergänzen Sie bei Bedarf eigene Typumwandlungen.
Erzeugt es den vollständigen Deserialisierungscode?
Das Tool erzeugt Struct-Definitionen. Zum Deserialisieren nutzen Sie json.Unmarshal(data, &myStruct) oder json.NewDecoder(r.Body).Decode(&myStruct) mit dem Standardpaket encoding/json.
Eine kurze Geschichte von Go und JSON
Go wurde bei Google von Rob Pike, Robert Griesemer und Ken Thompson im November 2009 angekündigt; das Paket encoding/json landete vor Go 1.0 (März 2012) in der Standardbibliothek. JSON-Parsing in Go basiert auf Reflection: Sie deklarieren ein Struct, taggen die Felder mit json:"name", und json.Unmarshal durchläuft sowohl das Struct als auch die Bytes. Das Muster erwies sich als so produktiv, dass das manuelle Schreiben von Structs für große APIs schnell mühsam wurde. Mat Ryer baute mholt/json-to-go als reines JavaScript-Tool im Jahr 2014 (es wird immer noch unter mholt.github.io/json-to-go gepflegt), das regex-basiertes JSON-Parsing im Browser verwendet. quicktype (David Siegel, 2017) verallgemeinerte die Idee auf 23 Sprachen, einschließlich TypeScript, Rust, Swift, Kotlin, Python, Java. Das leistungsorientierte easyjson (Mail.ru, 2016) überspringt Reflection, indem es Marshalling-Code zur Build-Zeit generiert, 4-5× schneller als encoding/json für Hot Paths. Go 1.18 (März 2022) fügte Generics hinzu, die einige Marshalling-Helfer vereinfachten, aber das Struct-Tag-Idiom nicht änderten. Go 1.21 (August 2023) fügte das experimentelle Paket encoding/json/v2 hinzu (Vorschlag wird ab 2024 noch diskutiert), das langjährige Fallstricke wie stille Typunverträglichkeiten und langsame Reflection beheben soll.
Struct vs map[string]interface{}: wann jedes sinnvoll ist
- Typisierte Structs gewinnen bei bekannten Formen. Wenn Sie die API kontrollieren oder ein stabiles Schema haben, geben Ihnen Structs Compile-Zeit-Feldprüfung, IDE-Autovervollständigung und 2-3× schnelleres Parsing.
json.Unmarshalin ein Struct berührt nur Felder, die es erkennt, und ignoriert unbekannte JSON-Schlüssel stillschweigend (es sei denn, Sie rufendecoder.DisallowUnknownFieldsauf). - Maps gewinnen bei beliebigem JSON.
map[string]interface{}(oder in Go 1.18+map[string]any) bewältigt wild variable Formen, Webhook-Payloads aus vielen Quellen, Plugin-Konfigurationen, MongoDB-Dokumente. Kompromiss: Jeder Zugriff benötigt eine Typzusicherung (data["age"].(float64)), und Zahlen werden standardmäßig alsfloat64geparst, was bei großen Ganzzahlen zu Präzisionsverlust führt. - Hybrid: Bekannte Felder als Struct, unbekannte als Map. Verwenden Sie
json.RawMessage, um das Parsen zu verzögern, oder fügen Sie ein Catch-all-FeldExtra map[string]interface{} `json:"-,inline"`hinzu (mit Hilfe von Bibliotheken wiego-restful). Die Go-SDKs von Stripe und Twilio verwenden dieses Muster für vorwärtskompatible API-Antworten. - Leistungslücke. Hot Paths (z. B. das Parsen von 10.000 Webhook-Events pro Sekunde) profitieren von generierten Marshallern:
easyjson,ffjson,go-json,sonic(ByteDance, 2022, verwendet JIT zur Generierung von Maschinencode zur Laufzeit, schnellste JSON-Bibliothek in Go). Generisches Struct-basiertes Parsen schafft vielleicht 100-200 MB/s;sonicschafft 1-2 GB/s. - Streaming für riesige JSON. Eine 1-GB-JSON-Datei passt nicht in den Speicher.
json.Decoder.Token()liest Token für Token.json.Decoder.More()durchläuft Array-Elemente einzeln. Verwenden Sie Streaming für Log-Dateien, große Datensätze, ND-JSON-Streams (ein JSON-Objekt pro Zeile, verwendet von OpenSearch, BigQuery, ChatGPT-API).
Wo JSON-zu-Go-Konvertierung echte Zeit spart
- REST-API-Integration. Stripe, GitHub, Slack, Notion liefern alle tief verschachteltes JSON. Eine Beispielantwort zu nehmen und in json-to-go einzufügen, liefert 80-90% des endgültigen Structs. Verwenden Sie die gesparte Zeit für die 10% (benutzerdefinierte Unmarshaller für Zeitformate, omitempty-Semantik, optionale Zeigerfelder).
- Webhook-Handler. Eine typische Stripe-Webhook-Payload hat 80-200 Felder mit 3-5 Verschachtelungsebenen. Das manuelle Eintippen des Go-Structs dauert 30-60 Minuten; das Einfügen der Beispiel-Payload über json-to-go dauert 30 Sekunden.
- Konfigurationsparsing. JSON-Konfigurationsdateien (von AWS Lambda gegenüber TOML bevorzugt, Docker Compose's
compose.json, devcontainer.json) werden sauber auf Go-Structs abgebildet.encoding/jsonbehandelt sowohl das Lesen als auch das Schreiben der Datei mit demselben Struct. - gRPC- und Protobuf-Brücken. Generierte Protobuf-Go-Typen enthalten
json-Tags. Beim Transcodieren zwischen Protobuf und JSON (gRPC-Gateway, Buf, Connect) hilft json-to-go, die Go-Seite aus dem JSON-Wire-Format zu entwerfen. - Datenbank-JSONB-Spalten. PostgreSQL
jsonb, MongoDB-Dokumente, MySQL-JSON-Spalten. Derdatabase/sql-Treiber gibt[]bytezurück, die Sie in ein Struct unmarshallen. Generatoren beschleunigen den ersten Durchlauf für Schema-on-Read-Tabellen. - Fixture-Daten für Tests. Eine echte JSON-Antwort aus der Produktion wird zur Testfixture. json-to-go gibt Ihnen das Struct zum Unmarshalling für Assertions. Kombiniert mit
testdata/-Verzeichnissen (Go-Konvention seit 1.10) hält es Tests nahe an der Realität. - CSV-zu-JSON-zu-Struct-Pipelines. Für Data-Engineering-Aufgaben: CSV lesen, als JSON zur Inspektion marshallen, in json-to-go einfügen, um das Struct zu erhalten, dann eine typisierte Pipeline schreiben. Viel schneller als das Erraten von Spaltentypen aus einer Tabellenkalkulation.
Häufige Fehler nach dem Generieren von Structs
- Vergessen der time.Time-Behandlung.
encoding/jsonnimmt RFC-3339-Format an (2026-05-13T12:34:56Z). Die meisten APIs liefern dies, aber einige verwenden Unix-Zeitstempel (Stripe), ISO ohne Zeitzone (Legacy-Microsoft-APIs) oder benutzerdefinierte Strings. Für Nicht-RFC-3339 definieren Sie einen benutzerdefinierten Typ mit einerUnmarshalJSON-Methode. - Ganzzahlüberlauf mit float64-Standard. Eine in
interface{}geparste JSON-Zahl wird zufloat64; Zahlen über 2^53 verlieren an Präzision. Stripe-Kunden-IDs, Twitter-Snowflake-IDs, Discord-Benutzer-IDs (alle 64-Bit) benötigenjson.Numberoderint64in Ihrem Struct. Verwenden Siejson.Decoder.UseNumber()für sicheres Parsen ininterface{}. - Falschverständnis von
omitempty.omitemptylässt das Feld beim Marshallen weg, wenn es der Nullwert ist (leerer String, 0, nil-Zeiger, leerer Slice/Map). Es bedeutet nicht «optional beim Unmarshallen». Einint-Feld mit Wert 0 ist nicht von einem fehlenden zu unterscheiden; verwenden Sie*int, wenn Sie wissen müssen, ob die API das Feld weggelassen oder Null gesendet hat. - Feldnamen-Groß-/Kleinschreibungsabweichungen. Go-Felder müssen exportiert (großgeschrieben) sein, um marshallt zu werden. Der Standard-JSON-Name ist der Go-Name wörtlich, daher wird
UserIDin JSON zu"UserID", es sei denn, es ist getaggt. Generatoren fügenjson:"userId"-Tags hinzu, um GosPascalCasemit JSONscamelCasezu verbinden. Das Vergessen des Tags bedeutet, dass Ihr Code «funktioniert» mit sich selbst, aber gegen externe APIs fehlschlägt. - Übermäßiges Verwenden von Zeigertypen. Generatoren verwenden manchmal standardmäßig
*stringoder*intaus Sicherheitsgründen. Dies macht, dass jeder Zugriff eine Nullprüfung benötigt. Wenn die API garantiert, dass das Feld immer vorhanden ist (lesen Sie die API-Dokumentation), verwenden Sie den Werttyp und überspringen Sie die Indirektion. - Inkonsistente Typen über Antworten hinweg. Einige APIs geben
tags: []string{"foo"}in einer Antwort undtags: "foo"als String in einer anderen zurück. Reine Codegenerierung kann das nicht überbrücken. Schreiben Sie ein benutzerdefiniertesUnmarshalJSON, das beide Fälle behandelt, oder wechseln Sie zuinterface{}und dokumentieren Sie die Variabilität. - Stilles Verwerfen unbekannter Felder. Standardmäßig ignoriert
json.UnmarshalJSON-Schlüssel, die nicht im Struct sind. Dies ist oft ein Fehler: Die API hat ein Feld hinzugefügt, Ihr Code weiß es nicht. Verwenden Siedecoder.DisallowUnknownFields()in Tests, um Drift zu erkennen; halten Sie es in der Produktion nachsichtig.
Weitere häufig gestellte Fragen
Worin unterscheidet sich dies vom kanonischen mholt/json-to-go?
Gleicher Kernalgorithmus: JSON parsen, Typen aus dem ersten Vorkommen jedes Feldes ableiten, ein Struct mit Backtick-getaggten Feldern generieren. Diese Implementierung läuft vollständig in Ihrem Browser ohne Analytics oder Netzwerkaufrufe; die kanonische wird unter mholt.github.io/json-to-go gehostet, ebenfalls nur Browser, aber auf einer anderen Domain. Die Ausgabe sollte für ~95% der Eingaben übereinstimmen; Grenzfälle (Arrays gemischter Typen, tief verschachtelte anonyme Structs) können leicht abweichen. Wenn Sie eine exakte mholt-Ausgabe benötigen, verwenden Sie diese; wenn Sie Datenschutzgarantien benötigen, dass das JSON Ihr Gerät nie verlässt, verwenden Sie diese.
Warum werden einige Felder als interface{} generiert?
Drei übliche Gründe. Erstens, null-Literal im Quell-JSON: Der Generator kann allein aus null keinen nützlichen Typ ableiten, also fällt er auf interface{} zurück. Ersetzen Sie es durch einen typisierten Zeiger (*string, *int), sobald Sie das tatsächliche Schema kennen. Zweitens, Arrays gemischter Typen: [1, "two", true] kann kein typisiertes Slice sein. Drittens, das Feld fehlt vollständig in Ihrer Stichprobe, fügen Sie ein repräsentativeres JSON ein, falls verfügbar. In Go 1.18+ können Sie interface{} durch den sauberen any-Alias ersetzen; sie sind auf Typebene identisch.
Kann ich JSON durch dieses Struct hin und her schicken, ohne Daten zu verlieren?
Im Allgemeinen ja, mit Vorbehalten. encoding/json bewahrt Feldwerte, aber nicht die Feldreihenfolge (die JSON-Spezifikation besagt, dass die Feldreihenfolge irrelevant ist; Go-Maps sind absichtlich zufällig). Numerische Präzision: int64s über 2^53 machen sicher Roundtrip als Go-int64, aber wenn Sie jemals zu float64 casten oder durch JavaScript senden (z. B. Browser-Zwischenstation), verlieren Sie Ziffern. Unbekannte JSON-Felder werden bei Unmarshal-dann-Remarshal stillschweigend verworfen, bewahren Sie sie mit einem map[string]json.RawMessage-Catch-all, wenn Roundtrip-Treue wichtig ist.
Wann sollte ich generierten Struct-Code (easyjson, sonic) statt encoding/json verwenden?
Standardmäßig encoding/json: gut genug für 95% der Dienste und wird mit der Sprache ausgeliefert. Wechseln Sie zu easyjson oder sonic, wenn Sie profiliert haben und JSON-Marshalling in Ihrem CPU-Flame-Graph mit >10% der Gesamtzeit auftaucht. Typische Bruchpunkte: HTTP-Dienste, die Tausende von Anfragen pro Sekunde bearbeiten, Log-Aggregatoren, die GBs/Stunde aufnehmen, Echtzeit-Feeds. Beide Alternativen behalten dieselben Struct-Definitionen und Tags bei, sodass Sie sie ohne Änderung der Felddeklarationen austauschen können.
Wird mein JSON an einen Server gesendet?
Nein. JSON-Parsing und Go-Code-Generierung laufen beide in JavaScript auf Ihrem Gerät. Öffnen Sie den Network-Tab in DevTools beim Einfügen; Sie werden null ausgehende Anfragen sehen. Sicher für proprietäre API-Antworten, Kundendaten-Fixtures, Webhook-Payloads mit PII und alles andere, was durch eine NDA abgedeckt ist.