JSON to Go Struct

Go Structs aus JSON generieren

Beispiel ausprobieren
Name des Root-Structs:

JSON-Eingabe

Go-Ausgabe

Läuft lokal · Sicher zum Einfügen von Secrets
Go Structs erscheinen hier…

Was ist die JSON-zu-Go-Konvertierung?

Die JSON-zu-Go-Konvertierung überführt rohe JSON-Daten in Go-Typdefinitionen, die mit dem encoding/json-Paket aus der Standardbibliothek von Go funktionieren. Go ist statisch typisiert — jedes JSON-Feld benötigt ein entsprechendes Struct-Feld mit dem richtigen Typ und einem Struct-Tag, das dem Serializer mitteilt, welchem JSON-Key es zugeordnet werden soll. Diese Definitionen für große oder tief verschachtelte API-Antworten von Hand zu schreiben ist zeitaufwendig und fehleranfällig.

Das encoding/json-Paket, seit Go 1.0 Teil der Go-Spezifikation, verwendet Reflection, um JSON-Keys exportierten Struct-Feldern zuzuordnen. Die Zuordnung ist standardmäßig case-insensitive, aber explizite JSON-Struct-Tags sind die gängige Praxis, weil sie Mehrdeutigkeiten beseitigen und es erlauben, die PascalCase-Konvention von Go zu verwenden, während das JSON in camelCase oder snake_case bleibt. Ein Konverter automatisiert das: Er liest das JSON, leitet Go-Typen aus den Werten ab und gibt Struct-Definitionen mit den korrekten Tags aus.

Das Typsystem von Go bildet JSON sauber ab. Strings werden zu string, Booleans zu bool, Ganzzahlen zu int und Fließkommazahlen zu float64. Verschachtelte JSON-Objekte werden zu eigenen benannten Structs, Arrays werden zu Slices. Die Lücke ist null: Go hat keinen universellen Nullable-Typ, daher werden null-Werte typischerweise zu Pointer-Typen (*string, *int) oder interface{}. Ein Generator erledigt das alles in Millisekunden.

Warum einen JSON-zu-Go-Konverter verwenden?

Go-Structs aus JSON von Hand zu definieren bedeutet, Klammern zu zählen, Typen zu raten und Tags bei jeder API-Änderung neu zu schreiben. Ein Konverter beseitigt diese Reibung.

Sofortige Typ-Generierung
JSON einfügen und korrekte Go-Struct-Definitionen in unter einer Sekunde erhalten. Kein manuelles Tippen von Feldern, keine vergessenen Tags, keine Ausrichtungsprobleme.
🔒
Privacy-First-Verarbeitung
Die Konvertierung läuft vollständig im Browser. Das JSON verlässt niemals den eigenen Rechner. API-Keys, Tokens und Nutzerdaten bleiben privat.
🏷️
Korrekte Struct-Tags
Jedes generierte Feld enthält ein json-Struct-Tag, das den Go-Feldnamen dem ursprünglichen JSON-Key zuordnet. Das verhindert stille Fehler bei json.Unmarshal.
📦
Keine Installation oder Anmeldung
Seite öffnen und JSON einfügen. Kein Go-Toolchain erforderlich, keine CLI-Tools zu installieren, kein Account zu erstellen.

JSON-zu-Go-Anwendungsfälle

REST-API-Client-Entwicklung
Request- und Response-Structs für Drittanbieter-REST-APIs generieren. Beispiel-JSON aus der API-Dokumentation einfügen und Typen erhalten, die sofort mit http.Client und json.NewDecoder einsatzbereit sind.
gRPC-Gateway-Modelle
Wenn ein Go-Service sowohl gRPC- als auch REST-Endpunkte bereitstellt, werden Go-Structs benötigt, die den JSON-Payloads entsprechen. Die JSON-Struktur in Structs konvertieren, die zu den Protobuf-Definitionen passen.
DevOps-Konfigurationsverarbeitung
JSON-Konfigurationsdateien (Terraform-Ausgaben, Kubernetes-Manifeste, CI/CD-Pipeline-Configs) in typisierte Go-Structs für eigene Tooling- und Automatisierungsskripte einlesen.
Datenpipeline-Verarbeitung
Go-Structs für JSON-Datensätze aus Message-Queues (Kafka, RabbitMQ, SQS) oder Data Lakes erstellen. Typisierte Structs erkennen Schema-Änderungen zur Compile-Zeit statt zur Laufzeit.
Test-Fixture-Aufbau
JSON-Test-Fixtures in Go-Structs konvertieren, um table-driven Tests zu ermöglichen. Typsichere Fixtures machen Testfehler einfacher zu diagnostizieren als rohe map[string]interface{}-Assertions.
Go's Typsystem kennenlernen
Einsteiger und Entwickler, die von dynamischen Sprachen kommen, können bekanntes JSON einfügen und sehen, wie Go dieselben Daten mit expliziten Typen, Pointern und Struct-Tags darstellt.

JSON-zu-Go-Typ-Mapping

Das encoding/json-Paket folgt spezifischen Regeln beim Abbilden von JSON-Werten auf Go-Typen. Die Tabelle zeigt das Standardmapping und gängige Alternativen. Die Spalte "Standard" zeigt, was die meisten Generatoren ausgeben. Die Spalte "Alternative" zeigt Typen, die je nach Anforderung gewählt werden können — etwa int64 für große IDs oder Pointer-Typen für nullable Felder.

JSON-TypBeispielwertStandardAlternative
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

Go-JSON-Struct-Tag-Referenz

Struct-Tags steuern, wie encoding/json Felder serialisiert und deserialisiert. Das json-Tag ist bei weitem das gebräuchlichste, kann aber mit anderen Tags (db, yaml, xml) am selben Feld kombiniert werden. Die Tag-Syntax ist ein per Backtick begrenzter String nach dem Feldtyp. Hier sind die json-Tag-Optionen, die encoding/json unterstützt.

TagVerhaltenAnwendungsfall
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal vs. json.NewDecoder

Go bietet zwei Wege zur JSON-Dekodierung: json.Unmarshal für Byte-Slices und json.NewDecoder für io.Reader-Streams. Beide verwenden dieselben Struct-Tag-Regeln, unterscheiden sich aber darin, wann sie eingesetzt werden.

json.Unmarshal
Nimmt ein []byte entgegen und befüllt einen Struct. Am besten geeignet für JSON, das bereits vollständig im Speicher liegt: HTTP-Response-Bodies, die mit io.ReadAll gelesen wurden, Dateiinhalte oder Test-Fixtures. Gibt einen Fehler zurück, wenn das JSON fehlerhaft ist oder Typen nicht übereinstimmen.
json.NewDecoder
Kapselt einen io.Reader und dekodiert JSON-Tokens, sobald sie eintreffen. Am besten für Streaming-Quellen geeignet: HTTP-Response-Bodies, die direkt gelesen werden, newline-delimited JSON (NDJSON)-Logs oder große Dateien, die nicht vollständig in den Speicher geladen werden sollen. Decode() in einer Schleife mit More() für Multi-Objekt-Streams aufrufen.

Code-Beispiele

Diese Beispiele zeigen, wie Go-Structs, die aus JSON generiert wurden, in echten Programmen verwendet werden, und wie sie aus anderen Sprachen generiert werden können. Die Go-Beispiele verwenden encoding/json aus der Standardbibliothek.

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

Häufig gestellte Fragen

Was ist der Unterschied zwischen json.Unmarshal und json.Decode?
json.Unmarshal nimmt ein []byte mit dem vollständigen JSON-Dokument entgegen und befüllt einen Struct. json.NewDecoder kapselt einen io.Reader und dekodiert JSON inkrementell. Unmarshal verwenden, wenn das vollständige JSON bereits im Speicher vorliegt (z. B. nach io.ReadAll). NewDecoder verwenden, wenn direkt aus einem HTTP-Response-Body, einer Datei oder einer anderen Streaming-Quelle gelesen wird, bei der das vollständige Puffern des Payloads vermieden werden soll.
Wie geht Go mit JSON-Feldern um, die im Payload fehlen?
Fehlende JSON-Felder lassen das entsprechende Go-Struct-Feld auf seinem Zero-Value: "" für Strings, 0 für Zahlen, false für Bools, nil für Pointer und Slices. Wenn zwischen "Feld fehlt" und "Feld vorhanden, aber null" unterschieden werden muss, einen Pointer-Typ wie *int oder *string verwenden. Ein nil-Pointer bedeutet, das Feld war nicht vorhanden; ein Nicht-nil-Pointer mit einem Zero-Value bedeutet, es war explizit auf 0 oder "" gesetzt.
Warum müssen Go-Struct-Felder für JSON exportiert (großgeschrieben) sein?
Das encoding/json-Paket verwendet Reflection für den Zugriff auf Struct-Felder, und Gos Reflection-Regeln erlauben nur den Zugriff auf exportierte (großgeschriebene) Felder. Beginnt ein Feld mit einem Kleinbuchstaben, kann encoding/json es nicht sehen und überspringt es stillschweigend beim Marshaling und Unmarshaling. Das json-Struct-Tag verwenden, um ein exportiertes PascalCase-Feld auf einen kleingeschriebenen JSON-Key abzubilden.
Wie gehe ich mit snake_case-JSON-Keys in Go um?
Ein json-Struct-Tag mit dem genauen JSON-Key-Namen hinzufügen. Ein JSON-Feld "user_name" wird beispielsweise einem Go-Feld UserName mit dem Tag `json:"user_name"` zugeordnet. Der Generator erledigt das automatisch. Es gibt keine globale Option in encoding/json, eine Benennungsregel festzulegen — jedes Feld muss sein eigenes Tag deklarieren.
Kann ich JSON mit null-Werten nach Go konvertieren?
Ja. Null-JSON-Werte werden in Go auf Pointer-Typen abgebildet. Ein Feld wie "age": null wird zu Age *int `json:"age"`. Wenn der JSON-Wert null ist, ist der Go-Pointer nil. Hat er einen Wert, alloziert Go ein int und der Pointer referenziert es. Für Felder, die immer nullable sind, ist ein Pointer der idiomatische Ansatz in Go.
Was passiert, wenn JSON eine Zahl enthält, die größer ist als Go's int aufnehmen kann?
Gos int ist plattformabhängig (32-Bit auf 32-Bit-Systemen, 64-Bit auf 64-Bit-Systemen). Für große Zahlen wie JavaScript-Timestamps oder Datenbank-IDs explizit int64 verwenden. Hat die JSON-Zahl Dezimalstellen, float64 verwenden. Für Zahlen, die die float64-Genauigkeit übersteigen (z. B. große Finanzwerte), json.Number verwenden, das die rohe String-Darstellung beibehält und selbst geparst werden kann.
Gibt es einen Unterschied zwischen diesem Tool und JSON-to-Go-Struct?
Dieses Tool generiert Go-Typdefinitionen mit Fokus auf encoding/json-Verwendungsmuster: korrekte Struct-Tags, saubere Typ-Inferenz und Verarbeitung von verschachtelten Strukturen und Arrays. Das JSON to Go Struct-Tool auf dieser Seite konzentriert sich auf Struct-Scaffolding. Beide erzeugen gültigen Go-Code. Das jeweils zum Workflow passende Tool verwenden. Die Struct-Tag-Referenz und die Typ-Mapping-Tabellen auf dieser Seite sind unabhängig vom gewählten Generator nützlich.