JSON in Struct Go

Genera struct Go da JSON

Prova un esempio
Nome struct radice:

Input JSON

Output Go

Esegue in locale · Sicuro per incollare segreti
Le struct Go appariranno qui…

Cos'è la conversione da JSON a struct Go?

La conversione da JSON a Go trasforma dati JSON grezzi in definizioni di tipo Go che funzionano con il pacchetto encoding/json della libreria standard di Go. Go è tipizzato staticamente, quindi ogni campo JSON richiede un campo struct corrispondente con il tipo corretto e un tag struct che indica al serializzatore quale chiave JSON associare. Scrivere queste definizioni a mano per risposte API grandi o profondamente annidate è lento e soggetto a errori.

Il pacchetto encoding/json, presente nella specifica Go fin dalla versione 1.0, usa la reflection per abbinare le chiavi JSON ai campi struct esportati. L'abbinamento è insensibile alle maiuscole per impostazione predefinita, ma i tag struct json espliciti sono la pratica standard perché eliminano ambiguità e permettono di usare la convenzione PascalCase di Go mentre il JSON rimane in camelCase o snake_case. Un convertitore automatizza tutto questo: legge il JSON, deduce i tipi Go dai valori e produce definizioni struct con i tag corretti.

Il sistema di tipi di Go si mappa in modo pulito su JSON. Le stringhe diventano string, i booleani diventano bool, gli interi diventano int e i numeri in virgola mobile diventano float64. Gli oggetti JSON annidati diventano struct con nome separati, e gli array diventano slice. L'unica lacuna riguarda null: Go non ha un tipo nullable universale, quindi i valori null diventano tipicamente tipi puntatore (*string, *int) o interface{}. Un generatore gestisce tutto questo in pochi millisecondi.

Perché usare un convertitore da JSON a Go?

Definire struct Go da JSON a mano significa contare le parentesi graffe, indovinare i tipi e riscrivere i tag ogni volta che l'API cambia. Un convertitore elimina questa fatica.

Generazione istantanea dei tipi
Incolla il JSON e ottieni definizioni struct Go corrette in meno di un secondo. Nessuna digitazione manuale dei campi, nessun tag dimenticato, nessun problema di allineamento.
🔒
Elaborazione rispettosa della privacy
La conversione avviene interamente nel browser. Il JSON non lascia mai il tuo computer. Chiavi API, token e dati utente rimangono privati.
🏷️
Tag struct corretti
Ogni campo generato include un tag struct json che associa il nome del campo Go alla chiave JSON originale. Questo previene discrepanze silenziose durante json.Unmarshal.
📦
Nessuna installazione o registrazione
Apri la pagina e incolla il JSON. Nessuna toolchain Go richiesta, nessuno strumento CLI da installare, nessun account da creare.

Casi d'uso di JSON in struct Go

Sviluppo di client REST API
Genera struct di richiesta e risposta per REST API di terze parti. Incolla JSON di esempio dalla documentazione API e ottieni tipi pronti per http.Client e json.NewDecoder.
Modelli gRPC Gateway
Quando un servizio Go espone sia endpoint gRPC che REST, hai bisogno di struct Go che corrispondano ai payload JSON. Converti la struttura JSON in struct che corrispondano alle tue definizioni protobuf.
Parsing di configurazioni DevOps
Analizza file di configurazione JSON (output Terraform, manifest Kubernetes, configurazioni pipeline CI/CD) in struct Go tipizzate per strumenti personalizzati e script di automazione.
Elaborazione di pipeline dati
Costruisci struct Go per record JSON provenienti da code di messaggi (Kafka, RabbitMQ, SQS) o data lake. Le struct tipizzate rilevano le modifiche allo schema in fase di compilazione anziché a runtime.
Configurazione di fixture di test
Converti fixture di test JSON in struct Go per test guidati da tabelle. Le fixture type-safe rendono i fallimenti dei test più facili da diagnosticare rispetto alle asserzioni raw su map[string]interface{}.
Imparare il sistema di tipi di Go
Studenti e sviluppatori che provengono da linguaggi dinamici possono incollare JSON familiare e vedere come Go rappresenta gli stessi dati con tipi espliciti, puntatori e tag struct.

Mappatura dei tipi da JSON a Go

Il pacchetto encoding/json segue regole specifiche quando associa i valori JSON ai tipi Go. La tabella seguente mostra la mappatura predefinita e le alternative comuni. La colonna "Default" è ciò che la maggior parte dei generatori produce. La colonna "Alternativa" mostra i tipi che potresti scegliere in base ai tuoi requisiti, come int64 per ID grandi o tipi puntatore per campi nullable.

Tipo JSONEsempioDefaultAlternativa
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{}

Riferimento ai tag struct JSON di Go

I tag struct controllano come encoding/json serializza e deserializza i campi. Il tag json è di gran lunga il più comune, ma puoi combinarlo con altri tag (db, yaml, xml) sullo stesso campo. La sintassi del tag è una stringa delimitata da backtick dopo il tipo del campo. Ecco le opzioni del tag json supportate da encoding/json.

TagComportamentoCaso d'uso
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 offre due modi per decodificare JSON: json.Unmarshal per slice di byte e json.NewDecoder per stream io.Reader. Entrambi usano le stesse regole dei tag struct, ma differiscono nel momento in cui usarli.

json.Unmarshal
Accetta un []byte e popola una struct. Ideale per JSON già completamente in memoria: body di risposte HTTP letti con io.ReadAll, contenuti di file o fixture di test. Restituisce un errore se il JSON è malformato o i tipi non corrispondono.
json.NewDecoder
Avvolge un io.Reader e decodifica i token JSON man mano che arrivano. Ideale per sorgenti in streaming: body di risposte HTTP letti direttamente, log JSON delimitati da newline (NDJSON) o file grandi che non vuoi caricare interamente in memoria. Chiama Decode() in un ciclo con More() per stream con oggetti multipli.

Esempi di codice

Questi esempi mostrano come usare struct Go generate da JSON in programmi reali, oltre a come generarle da altri linguaggi. Gli esempi Go usano encoding/json dalla libreria standard.

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
}

Domande frequenti

Qual è la differenza tra json.Unmarshal e json.Decode?
json.Unmarshal accetta un []byte contenente l'intero documento JSON e popola una struct. json.NewDecoder avvolge un io.Reader e decodifica JSON in modo incrementale. Usa Unmarshal quando hai già il JSON completo in memoria (ad esempio, dopo io.ReadAll). Usa NewDecoder quando leggi direttamente dal body di una risposta HTTP, da un file o da qualsiasi sorgente in streaming in cui vuoi evitare di bufferizzare l'intero payload.
Come gestisce Go i campi JSON mancanti nel payload?
I campi JSON mancanti lasciano il campo struct Go corrispondente al suo valore zero: "" per le stringhe, 0 per i numeri, false per i bool, nil per puntatori e slice. Se hai bisogno di distinguere tra "campo mancante" e "campo presente ma zero", usa un tipo puntatore come *int o *string. Un puntatore nil significa che il campo era assente; un puntatore non-nil con valore zero significa che era stato impostato esplicitamente a 0 o "".
Perché i campi struct Go devono essere esportati (con la maiuscola) per JSON?
Il pacchetto encoding/json usa la reflection per accedere ai campi struct, e le regole di reflection di Go consentono l'accesso solo ai campi esportati (con iniziale maiuscola). Se un campo inizia con una lettera minuscola, encoding/json non riesce a vederlo e lo salterà silenziosamente sia durante il marshaling che l'unmarshaling. Usa il tag struct json per associare un campo PascalCase esportato a una chiave JSON in minuscolo.
Come gestisco le chiavi JSON in snake_case in Go?
Aggiungi un tag struct json con il nome esatto della chiave JSON. Ad esempio, un campo JSON "user_name" viene associato a un campo Go UserName con il tag `json:"user_name"`. Il generatore gestisce questo automaticamente. Non esiste un'opzione globale in encoding/json per impostare una policy di denominazione; ogni campo deve dichiarare il proprio tag.
Posso convertire JSON con valori null in Go?
Sì. I valori JSON null vengono associati a tipi puntatore in Go. Un campo come "age": null diventa Age *int `json:"age"`. Quando il valore JSON è null, il puntatore Go è nil. Quando ha un valore, Go alloca un int e il puntatore vi fa riferimento. Per i campi sempre nullable, usare un puntatore è l'approccio idiomatico in Go.
Cosa succede se il JSON contiene un numero più grande di quello che Go int può contenere?
Il tipo int di Go dipende dalla piattaforma (32 bit su sistemi a 32 bit, 64 bit su sistemi a 64 bit). Per numeri grandi come timestamp JavaScript o ID di database, usa int64 esplicitamente. Se il numero JSON ha cifre decimali, usa float64. Per numeri che superano la precisione di float64 (ad esempio, valori finanziari grandi), usa json.Number, che mantiene la rappresentazione stringa grezza e ti permette di analizzarlo tu stesso.
C'è differenza tra questo strumento e JSON-to-Go-Struct?
Questo strumento genera definizioni di tipo Go con attenzione ai pattern di utilizzo di encoding/json: tag struct corretti, deduzione corretta dei tipi e gestione di strutture annidate e array. Lo strumento JSON to Go Struct su questo sito si concentra sullo scaffolding delle struct. Entrambi producono codice Go valido. Usa quello che si adatta meglio al tuo flusso di lavoro. Il riferimento ai tag struct e le tabelle di mappatura dei tipi in questa pagina sono utili indipendentemente dal generatore scelto.