JSON to Go Struct

Generera Go-strukturer från JSON

Prova ett exempel
Rotstrukturnamn:

JSON-inmatning

Go-utdata

Körs lokalt · Säkert att klistra in hemligheter
Go-strukturer visas här…

Vad är JSON till Go-konvertering?

JSON till Go-konvertering omvandlar rå JSON-data till Go-typdefinitioner som fungerar med paketet encoding/json i Go:s standardbibliotek. Go är statiskt typat, vilket innebär att varje JSON-fält behöver ett motsvarande struct-fält med korrekt typ och en struct-tagg som talar om för serialiseraren vilket JSON-nyckel som ska mappas. Att skriva dessa definitioner för hand för stora eller djupt nästlade API-svar är tidskrävande och lätt att göra fel på.

Paketet encoding/json, som har funnits i Go-specifikationen sedan Go 1.0, använder reflektion för att matcha JSON-nycklar mot exporterade struct-fält. Matchningen är skiftlägesokänslig som standard, men explicita json struct-taggar är standardpraxis eftersom de eliminerar tvetydighet och låter dig använda Go:s PascalCase-konvention medan JSON behåller camelCase eller snake_case. En konverterare automatiserar detta: den läser din JSON, härleder Go-typer från värdena och producerar struct-definitioner med korrekta taggar.

Go:s typsystem mappas på ett naturligt sätt till JSON. Strängar blir string, booleaner blir bool, heltal blir int och flyttal blir float64. Nästlade JSON-objekt blir separata namngivna strukturer och arrayer blir slices. Det enda gapet är null: Go saknar en universell nullbar typ, så null-värden blir vanligtvis pekare (*string, *int) eller interface{}. En generator hanterar allt detta på millisekunder.

Varför använda en JSON till Go-konverterare?

Att definiera Go-strukturer från JSON för hand innebär att räkna klammerparenteser, gissa typer och skriva om taggar varje gång API:et ändras. En konverterare tar bort det friktionsmomentet.

Omedelbar typgenerering
Klistra in din JSON och få korrekta Go struct-definitioner på under en sekund. Ingen manuell fältinmatning, inga missade taggar, inga justeringsproblem.
🔒
Integritetsfokuserad hantering
Konverteringen körs helt i din webbläsare. Din JSON lämnar aldrig din maskin. API-nycklar, tokens och användardata förblir privata.
🏷️
Korrekta struct-taggar
Varje genererat fält inkluderar en json struct-tagg som mappar Go-fältnamnet till den ursprungliga JSON-nyckeln. Detta förhindrar tysta missmatchningar under json.Unmarshal.
📦
Ingen installation eller registrering
Öppna sidan och klistra in din JSON. Ingen Go-verktygskedja krävs, inga CLI-verktyg att installera, inget konto att skapa.

Användningsfall för JSON till Go

REST API-klientutveckling
Generera request- och response-strukturer för tredjeparts-REST-API:er. Klistra in exempelJSON från API-dokumentation och få typer färdiga för http.Client och json.NewDecoder.
gRPC Gateway-modeller
När en Go-tjänst exponerar både gRPC- och REST-endpoints behöver du Go-strukturer som matchar JSON-payloads. Konvertera JSON-formen till strukturer som matchar dina protobuf-definitioner.
DevOps-konfigurationsanalys
Analysera JSON-konfigurationsfiler (Terraform-utdata, Kubernetes-manifest, CI/CD-pipelinekonfigurationer) till typade Go-strukturer för anpassade verktyg och automatiseringsskript.
Datapipelinebearbetning
Bygg Go-strukturer för JSON-poster från meddelandeköer (Kafka, RabbitMQ, SQS) eller datalager. Typade strukturer fångar schemaändringar vid kompileringstid istället för körningstid.
Testfixturinställning
Konvertera JSON-testfixtures till Go-strukturer för tabelldrivna tester. Typsäkra fixtures gör testfel lättare att diagnostisera än råa map[string]interface{}-påståenden.
Lär dig Go:s typsystem
Studenter och utvecklare som kommer från dynamiska språk kan klistra in bekant JSON och se hur Go representerar samma data med explicita typer, pekare och struct-taggar.

JSON till Go-typmappning

Paketet encoding/json följer specifika regler när JSON-värden mappas till Go-typer. Tabellen nedan visar standardmappningen och vanliga alternativ. Kolumnen "Standard" visar vad de flesta generatorer producerar. Kolumnen "Alternativ" visar typer du kan välja baserat på dina krav, till exempel int64 för stora ID:n eller pekartyper för nullbara fält.

JSON-typExempelStandardAlternativ
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{}

Referens för Go JSON struct-taggar

Struct-taggar styr hur encoding/json serialiserar och deserialiserar fält. json-taggen är överlägset vanligast, men du kan kombinera den med andra taggar (db, yaml, xml) på samma fält. Taggsyntaxen är en backtick-avgränsad sträng efter fälttypen. Här är de json-taggsalternativ som encoding/json stöder.

TaggBeteendeAnvändningsfall
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 erbjuder två sätt att avkoda JSON: json.Unmarshal för byte-slices och json.NewDecoder för io.Reader-strömmar. Båda använder samma struct-taggregler, men de skiljer sig åt i när de bör användas.

json.Unmarshal
Tar en []byte och fyller i en struct. Bäst för JSON som redan finns helt i minnet: HTTP-svarskroppar lästa med io.ReadAll, filinnehåll eller testfixtures. Returnerar ett fel om JSON är felaktig eller typerna inte stämmer.
json.NewDecoder
Omsluter en io.Reader och avkodar JSON-tokens allteftersom de anländer. Bäst för strömmande källor: HTTP-svarskroppar lästa direkt, radavgränsad JSON (NDJSON) loggfiler eller stora filer du inte vill ladda helt i minnet. Anropa Decode() i en loop med More() för strömmar med flera objekt.

Kodexempel

Dessa exempel visar hur man använder Go-strukturer genererade från JSON i verkliga program, samt hur man genererar dem från andra språk. Go-exemplen använder encoding/json från standardbiblioteket.

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
}

Vanliga frågor

Vad är skillnaden mellan json.Unmarshal och json.Decode?
json.Unmarshal tar en []byte som innehåller hela JSON-dokumentet och fyller i en struct. json.NewDecoder omsluter en io.Reader och avkodar JSON stegvis. Använd Unmarshal när du redan har den fullständiga JSON i minnet (t.ex. efter io.ReadAll). Använd NewDecoder när du läser direkt från en HTTP-svarskropp, en fil eller en strömmande källa där du vill undvika att buffra hela nyttolasten.
Hur hanterar Go JSON-fält som saknas i nyttolasten?
Saknade JSON-fält lämnar motsvarande Go struct-fält vid sitt nollvärde: "" för strängar, 0 för tal, false för booleaner, nil för pekare och slices. Om du behöver skilja mellan "fält saknas" och "fält finns men är noll" använder du en pekartyp som *int eller *string. En nil-pekare innebär att fältet saknades; en icke-nil-pekare med nollvärde innebär att det explicit sattes till 0 eller "".
Varför måste Go struct-fält vara exporterade (versalerade) för JSON?
Paketet encoding/json använder reflektion för att komma åt struct-fält, och Go:s reflektionsregler tillåter endast åtkomst till exporterade (versalerade) fält. Om ett fält börjar med en gemen bokstav kan encoding/json inte se det och hoppar över det tyst vid både marshaling och unmarshaling. Använd json struct-taggen för att mappa ett exporterat PascalCase-fält till en gemen JSON-nyckel.
Hur hanterar jag snake_case JSON-nycklar i Go?
Lägg till en json struct-tagg med det exakta JSON-nyckelnamnet. Till exempel mappas ett JSON-fält "user_name" till ett Go-fält UserName med taggen `json:"user_name"`. Generatorn hanterar detta automatiskt. Det finns inget globalt alternativ i encoding/json för att ange en namngivningspolicy; varje fält måste deklarera sin egen tagg.
Kan jag konvertera JSON med null-värden till Go?
Ja. Null-JSON-värden mappas till pekartyper i Go. Ett fält som "age": null blir Age *int `json:"age"`. När JSON-värdet är null är Go-pekaren nil. När det har ett värde allokerar Go ett int och pekaren refererar till det. För fält som alltid är nullbara är användning av en pekare det idiomatiska tillvägagångssättet i Go.
Vad händer om JSON innehåller ett tal som är större än vad Go:s int kan hålla?
Go:s int är plattformsberoende (32-bitars på 32-bitarssystem, 64-bitars på 64-bitarssystem). För stora tal som JavaScript-tidsstämplar eller databas-ID:n, använd int64 explicit. Om JSON-talet har decimaler, använd float64. För tal som överskrider float64:s precision (t.ex. stora finansiella värden), använd json.Number, som behåller den råa strängrepresentationen och låter dig analysera den själv.
Är det någon skillnad mellan det här verktyget och JSON-to-Go-Struct?
Det här verktyget genererar Go-typdefinitioner med fokus på encoding/json-användningsmönster: korrekta struct-taggar, korrekt typhärledning och hantering av nästlade strukturer och arrayer. JSON to Go Struct-verktyget på den här sidan fokuserar på struct-scaffolding. Båda producerar giltig Go-kod. Använd det som passar ditt arbetsflöde. Struct-taggreferensen och typmapsningstabellerna på den här sidan är användbara oavsett vilken generator du väljer.