100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in Go — Structs, die in Ihre Datei passen

Ein JSON-Beispiel in Go-Structs mit json-Tags verwandeln. Die Spalten stehen so ausgerichtet, wie gofmt sie ließe — das Einfügen braucht kein Aufräumen.

Sofort Privat Null Cookies

JSON-Eingabe

Go-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe werden Go-Structs, eines je Objekt.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
type Root struct {
	Id        int     `json:"id"`
	FirstName string  `json:"firstName"`
	Address   Address `json:"address"`
}

type Address struct {
	City string `json:"city"`
}

Die Spalten sind so ausgerichtet, wie gofmt sie ausrichtet — Name, Typ, Tag. Niemand liest unformatiertes Go, und dies in eine Datei zu kleben und gofmt laufen zu lassen sollte nichts ändern.

Diese Ausrichtung ist neu: die Felder kamen bisher durch ein einzelnes Leerzeichen getrennt heraus. Eine Kleinigkeit — und doch eine Ausgabe, die nicht nach der Sprache aussah, auf die sie sich beruft.

Namen sind exportiert, Schlüssel leben im Tag

encoding/json übergeht nicht exportierte Felder vollständig: ein kleingeschriebenes Feld dekodiert nichts und kodiert nichts, ohne ein Wort. Darum ist jedes Feld exportiert — PascalCase, mit einem F davor, wenn der Schlüssel mit einer Ziffer beginnt (2fa ergibt F2fa) — und der Tag trägt den Schlüssel unverändert.

Zwei Schlüssel, die denselben Go-Namen ergeben — user-name und userName —, werden durch ein nummeriertes Suffix getrennt. Die Tags bleiben verschieden, also gehört jedes Feld weiterhin zu seinem eigenen Schlüssel.

omitempty lässt mehr weg, als man denkt

Die Option hängt ,omitempty an jeden Tag. Sie wirkt nur beim Kodieren und unterscheidet „fehlend“ nicht von „null“: 0, "", false, ein leerer Slice und eine nil-Map verschwinden alle aus der Ausgabe.

Für einen optionalen Filter ist das richtig, für eine Punktzahl, die legitim null sein darf, falsch. Wo der Unterschied zählt, ist ein Zeiger die übliche Antwort — *int —, der für nil null kodiert und sonst eine echte 0.

Typen, und was eine Probe nicht sagen kann

  • Ganzzahlen werden int, nicht int64. Auf jeder 64-Bit-Plattform ist das dasselbe; ein Wert darüber scheitert beim Dekodieren laut, statt still abgeschnitten zu werden.
  • null und unbekannte Werte werden any. Ein leeres Array wird []any, ein gemischtes auch, außer es mischt Ganzzahlen und Fließkommazahlen — dann deckt []float64 beide ab.
  • Kein Feld ist ein Zeiger und keines optional, denn eine Probe kann das nicht zeigen. Ein manchmal fehlender Schlüssel ist ein *T, das Sie selbst ergänzen — und das Erste, was sich gegen eine zweite Nutzlast prüfen lässt.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Warum sind die Feldnamen großgeschrieben?
Weil `encoding/json` nur exportierte Felder sieht. Ein kleingeschriebenes `id` würde in beide Richtungen übergangen, wortlos: das Struct übersetzt, dekodiert nichts hinein und kodiert nichts heraus. Der Tag bewahrt den ursprünglichen Schlüssel, also liest und schreibt `Id int `json:"id"`` genau das, was Ihr Dokument enthält.
Was tut die Option omitempty wirklich?
Sie hängt `,omitempty` an jeden Tag, was einen Nullwert **beim Kodieren** weglässt. Beim Dekodieren ändert sie nichts, und sie unterscheidet einen fehlenden Schlüssel nicht von einer Null: `0`, `""`, `false` und ein leerer Slice verschwinden alle aus der Ausgabe. Zählt eine echte Null, ist ein Zeigerfeld die übliche Antwort.
Soll mein Feld `Id` oder `ID` heißen?
Gos Stilrichtlinie sagt `ID`, und Linter sagen es auch. Dieses Werkzeug schreibt `Id`, mechanisch aus dem Schlüssel abgeleitet, denn Abkürzungen umzubenennen hieße, eine Liste zu führen — `ID`, `URL`, `API`, `HTTP` — und sie auf nie gesehene Schlüssel anzuwenden. Der Tag macht die Umbenennung harmlos: eine sichere Änderung, die Sie selbst vornehmen.

Ähnliche Konverter