JSON to Go Struct

Go structs genereren vanuit JSON

Probeer een voorbeeld
Naam root-struct:

JSON-invoer

Go-uitvoer

Draait lokaal · Veilig om secrets te plakken
Go structs verschijnen hier…

Wat is JSON naar Go-conversie?

JSON naar Go-conversie zet ruwe JSON-data om in Go type-definities die werken met het encoding/json-pakket uit de standaardbibliotheek van Go. Go is statisch getypeerd, dus elk JSON-veld heeft een bijbehorend struct-veld nodig met het juiste type en een struct-tag die de serializer vertelt welke JSON-sleutel eraan gekoppeld is. Die definities met de hand schrijven voor grote of diep geneste API-responses is traag en foutgevoelig.

Het encoding/json-pakket, onderdeel van de Go-specificatie sinds Go 1.0, gebruikt reflectie om JSON-sleutels te koppelen aan geëxporteerde struct-velden. De koppeling is standaard hoofdletterongevoelig, maar expliciete json struct-tags zijn de gangbare aanpak omdat ze ambiguïteit wegnemen en je de PascalCase-conventie van Go kunt hanteren terwijl de JSON in camelCase of snake_case blijft. Een converter automatiseert dit: hij leest je JSON, leidt Go-typen af uit de waarden en geeft struct-definities terug met de juiste tags.

Het typesysteem van Go past goed op JSON. Strings worden string, booleans worden bool, integers worden int en kommagetallen worden float64. Geneste JSON-objecten worden afzonderlijke benoemde structs en arrays worden slices. De enige uitzondering is null: Go heeft geen universeel nullable type, dus null-waarden worden doorgaans pointer-typen (*string, *int) of interface{}. Een generator verwerkt dit alles in milliseconden.

Waarom een JSON naar Go-converter gebruiken?

Go structs met de hand definiëren vanuit JSON betekent accolades tellen, types raden en tags herschrijven telkens als de API verandert. Een converter neemt die moeite weg.

Direct typen genereren
Plak je JSON en ontvang correcte Go struct-definities in minder dan een seconde. Geen handmatig typen van velden, geen vergeten tags, geen uitlijnproblemen.
🔒
Privacy-first verwerking
De conversie verloopt volledig in je browser. Je JSON verlaat je apparaat nooit. API-sleutels, tokens en gebruikersdata blijven privé.
🏷️
Correcte struct-tags
Elk gegenereerd veld bevat een json struct-tag die de Go-veldnaam koppelt aan de oorspronkelijke JSON-sleutel. Dit voorkomt stille afwijkingen tijdens json.Unmarshal.
📦
Geen installatie of aanmelding
Open de pagina en plak je JSON. Geen Go-toolchain nodig, geen CLI-tools te installeren, geen account aan te maken.

Toepassingen van JSON naar Go

REST API-clientontwikkeling
Genereer request- en response-structs voor externe REST API's. Plak voorbeeld-JSON uit API-documentatie en ontvang typen klaar voor http.Client en json.NewDecoder.
gRPC Gateway-modellen
Wanneer een Go-service zowel gRPC- als REST-endpoints blootstelt, heb je Go structs nodig die overeenkomen met de JSON-payloads. Converteer de JSON-shape naar structs die aansluiten op je protobuf-definities.
DevOps-configuratieparsing
Verwerk JSON-configuratiebestanden (Terraform-uitvoer, Kubernetes-manifests, CI/CD-pipelineconfiguraties) naar getypeerde Go structs voor eigen tooling en automatiseringsscripts.
Data pipeline-verwerking
Bouw Go structs voor JSON-records uit berichtenwachtrijen (Kafka, RabbitMQ, SQS) of data lakes. Getypeerde structs signaleren schema-wijzigingen tijdens compilatie in plaats van tijdens runtime.
Testfixtures instellen
Converteer JSON-testfixtures naar Go structs voor tabelgestuurde tests. Type-veilige fixtures maken testfouten eenvoudiger te diagnosticeren dan ruwe map[string]interface{}-assertions.
Het typesysteem van Go leren
Studenten en ontwikkelaars die komen uit dynamische talen kunnen vertrouwde JSON plakken en zien hoe Go dezelfde data weergeeft met expliciete typen, pointers en struct-tags.

JSON naar Go type-mapping

Het encoding/json-pakket volgt specifieke regels bij het koppelen van JSON-waarden aan Go-typen. De onderstaande tabel toont de standaard-mapping en veelgebruikte alternatieven. De kolom "Standaard" is wat de meeste generators produceren. De kolom "Alternatief" toont typen die je kunt kiezen op basis van je vereisten, zoals int64 voor grote ID's of pointer-typen voor nullable velden.

JSON-typeVoorbeeldStandaardAlternatief
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-referentie

Struct-tags bepalen hoe encoding/json velden serialiseert en deserialiseert. De json-tag is verreweg de meest voorkomende, maar je kunt hem combineren met andere tags (db, yaml, xml) op hetzelfde veld. De tag-syntaxis is een backtick-afgebakende string na het veldtype. Hier zijn de json-tagopties die encoding/json ondersteunt.

TagGedragToepassing
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 biedt twee manieren om JSON te decoderen: json.Unmarshal voor byte-slices en json.NewDecoder voor io.Reader-streams. Beide gebruiken dezelfde struct-tagregels, maar verschillen in wanneer je ze toepast.

json.Unmarshal
Verwerkt een []byte en vult een struct. Geschikt voor JSON die al volledig in geheugen staat: HTTP response-bodies gelezen met io.ReadAll, bestandsinhoud of testfixtures. Geeft een fout terug als de JSON misvormd is of typen niet overeenkomen.
json.NewDecoder
Wikkelt een io.Reader en decodeert JSON-tokens terwijl ze binnenkomen. Geschikt voor streaming-bronnen: HTTP response-bodies direct ingelezen, newline-gescheiden JSON (NDJSON)-logs of grote bestanden die je niet volledig in geheugen wilt laden. Roep Decode() aan in een lus met More() voor stromen met meerdere objecten.

Codevoorbeelden

Deze voorbeelden laten zien hoe je Go structs gegenereerd vanuit JSON gebruikt in echte programma's, en hoe je ze genereert vanuit andere talen. De Go-voorbeelden gebruiken encoding/json uit de standaardbibliotheek.

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
}

Veelgestelde vragen

Wat is het verschil tussen json.Unmarshal en json.Decode?
json.Unmarshal verwerkt een []byte met het volledige JSON-document en vult een struct. json.NewDecoder wikkelt een io.Reader en decodeert JSON incrementeel. Gebruik Unmarshal wanneer je de volledige JSON al in geheugen hebt (bijv. na io.ReadAll). Gebruik NewDecoder wanneer je direct leest van een HTTP response-body, een bestand of een andere streamingbron waarbij je de volledige payload niet wilt bufferen.
Hoe gaat Go om met JSON-velden die ontbreken in de payload?
Ontbrekende JSON-velden laten het bijbehorende Go struct-veld op zijn nulwaarde staan: "" voor strings, 0 voor getallen, false voor bools, nil voor pointers en slices. Als je onderscheid moet maken tussen "veld ontbreekt" en "veld aanwezig maar nul", gebruik dan een pointer-type zoals *int of *string. Een nil-pointer betekent dat het veld afwezig was; een niet-nil pointer met een nulwaarde betekent dat het expliciet op 0 of "" was gezet.
Waarom moeten Go struct-velden geëxporteerd (met hoofdletter) zijn voor JSON?
Het encoding/json-pakket gebruikt reflectie om struct-velden te benaderen, en de reflectieregels van Go staan alleen toegang toe tot geëxporteerde (hoofdletter) velden. Als een veld met een kleine letter begint, kan encoding/json het niet zien en slaat het stilletjes over tijdens zowel marshaling als unmarshaling. Gebruik de json struct-tag om een geëxporteerd PascalCase-veld te koppelen aan een JSON-sleutel met kleine letters.
Hoe ga ik om met snake_case JSON-sleutels in Go?
Voeg een json struct-tag toe met de exacte JSON-sleutelnaam. Een JSON-veld "user_name" mapt bijvoorbeeld naar een Go-veld UserName met de tag `json:"user_name"`. De generator verwerkt dit automatisch. Er is geen globale optie in encoding/json voor een naamgevingsbeleid; elk veld moet zijn eigen tag opgeven.
Kan ik JSON met null-waarden naar Go converteren?
Ja. Null JSON-waarden worden pointer-typen in Go. Een veld zoals "age": null wordt Age *int `json:"age"`. Wanneer de JSON-waarde null is, is de Go-pointer nil. Wanneer er een waarde is, wijst Go een int toe en verwijst de pointer ernaar. Voor velden die altijd nullable zijn, is een pointer de idiomatische aanpak in Go.
Wat gebeurt er als JSON een getal bevat dat groter is dan Go's int aankan?
Go's int is platformafhankelijk (32-bit op 32-bit systemen, 64-bit op 64-bit systemen). Gebruik voor grote getallen zoals JavaScript-timestamps of database-ID's expliciet int64. Als het JSON-getal decimalen heeft, gebruik dan float64. Voor getallen die de float64-precisie overschrijden (bijv. grote financiële waarden), gebruik json.Number, dat de ruwe stringrepresentatie bewaart en je zelf laat verwerken.
Is er een verschil tussen deze tool en JSON-to-Go-Struct?
Deze tool genereert Go type-definities met nadruk op encoding/json-gebruikspatronen: correcte struct-tags, juiste type-inferentie en verwerking van geneste structuren en arrays. De JSON to Go Struct-tool op deze site richt zich op struct-scaffolding. Beide produceren geldige Go-code. Gebruik wat het beste bij je workflow past. De struct-tagreferentie en type-mappingtabellen op deze pagina zijn nuttig ongeacht welke generator je kiest.