Convertitore JSON a Go Struct Gratuito

Analizza JSON e genera automaticamente definizioni di struct Go con nomi di campo in PascalCase e tag json per un'integrazione fluida nel tuo codice Go.

Input e output

Opzioni

Come funziona

  1. Incolla il tuo JSON: inserisci qualsiasi oggetto JSON o struttura annidata nel campo di input.
  2. Ottieni la struct Go: la definizione equivalente di struct Go con nomi di campi, tipi e tag JSON corretti viene generata all'istante.
  3. Copia e usa: copia il codice della struct e incollalo nel tuo progetto Go per iniziare a deserializzare dati JSON.

Perché usare il convertitore JSON → struct Go?

Scrivere struct Go a mano per risposte JSON complesse è noioso e soggetto a errori, soprattutto quando l'API restituisce oggetti profondamente annidati con dozzine di campi. JSON → Go automatizza questo analizzando la forma del JSON e generando struct Go correttamente tipizzate con tag json:"…" appropriati, corrispondenti ai nomi dei campi JSON. Questo accelera lo sviluppo Go quando si consumano API REST, si elaborano payload webhook o si lavora con qualsiasi sorgente di dati JSON.

Funzionalità

  • Generazione di struct annidate: gli oggetti JSON profondamente annidati sono convertiti in definizioni di struct Go annidate.
  • Inferenza di tipi: stringhe, numeri, booleani, array e valori null sono associati ai tipi Go appropriati.
  • Tag JSON: tutti i campi includono tag di struct json:"fieldName" corrispondenti alle chiavi JSON originali.
  • Gestione degli array: gli array JSON diventano slice Go con il tipo di elementi corretto.
  • Tipi puntatore: i campi JSON nullable sono rappresentati da tipi puntatore (per esempio, *string).

Domande frequenti

Come vengono gestiti i valori null?

I campi JSON null sono convertiti in tipi puntatore in Go (per esempio, *string, *int), il che permette di rappresentare sia nil sia un valore reale. Questo gestisce correttamente i campi opzionali o nullable nella risposta API.

E se il JSON ha tipi incoerenti?

Se lo stesso campo appare con tipi diversi tra gli oggetti JSON (frequente nelle API reali), il convertitore può inferire interface{} (any nel Go moderno). Rivedi questi campi e aggiungi asserzioni di tipo personalizzate se necessario.

Genera il codice di deserializzazione completo?

Lo strumento genera le definizioni di struct. Per deserializzare, usa json.Unmarshal(data, &myStruct) o json.NewDecoder(r.Body).Decode(&myStruct) con il pacchetto encoding/json standard.

Breve storia di Go e JSON

Go è stato annunciato presso Google da Rob Pike, Robert Griesemer e Ken Thompson nel novembre 2009; il pacchetto encoding/json è entrato nella libreria standard prima di Go 1.0 (marzo 2012). Il parsing JSON in Go è basato sulla reflection: si dichiara una struct, si taggano i campi con json:«name», e json.Unmarshal percorre sia la struct sia i byte. Il pattern si è rivelato così produttivo che scrivere a mano le struct per grandi API è diventato presto tedioso. Matt Holt ha costruito mholt/json-to-go come strumento solo-JavaScript nel 2014 (ancora mantenuto su mholt.github.io/json-to-go) utilizzando analisi JSON basata su regex nel browser. quicktype (David Siegel, 2017) ha generalizzato l'idea a 23 linguaggi tra cui TypeScript, Rust, Swift, Kotlin, Python, Java. easyjson orientato alle prestazioni (Mail.ru, 2016) salta la reflection generando codice di marshalling a tempo di compilazione, 4-5× più veloce di encoding/json per gli hot path. Go 1.18 (marzo 2022) ha aggiunto i generics, semplificando alcuni helper di marshalling ma senza cambiare l'idioma dei tag di struct. Go 1.21 (agosto 2023) ha aggiunto il pacchetto sperimentale encoding/json/v2 (proposta ancora in discussione nel 2024), con l'obiettivo di correggere annose insidie come mismatch silenziosi di tipo e reflection lenta.

Struct vs map[string]interface{}: quando ognuno ha senso

  • Le struct tipizzate vincono per forme note. Se controlli l'API o hai uno schema stabile, le struct ti danno verifica dei campi a tempo di compilazione, autocompletamento IDE e parsing 2-3× più veloce. json.Unmarshal in una struct tocca solo i campi che riconosce, ignorando silenziosamente le chiavi JSON sconosciute (a meno che non chiami decoder.DisallowUnknownFields).
  • Le map vincono per JSON arbitrario. map[string]interface{} (o in Go 1.18+ map[string]any) gestisce forme molto variabili, payload webhook da molte fonti, configurazioni plugin, documenti MongoDB. Compromesso: ogni accesso richiede un'asserzione di tipo (data[«age»].(float64)), e i numeri vengono parsati come float64 di default, perdendo precisione per i grandi interi.
  • Ibrido: campi noti in struct, sconosciuti in map. Usa json.RawMessage per rimandare il parsing o aggiungi un campo catch-all Extra map[string]interface{} `json:«-,inline»` (con l'aiuto di librerie come go-restful). Gli SDK Go di Stripe e Twilio usano questo pattern per risposte API retrocompatibili.
  • Divario di prestazioni. Gli hot path (ad esempio parsare 10.000 eventi webhook al secondo) traggono vantaggio dai marshaller generati: easyjson, ffjson, go-json, sonic (ByteDance, 2022, usa JIT per generare codice macchina a runtime, la libreria JSON più veloce in Go). Il parsing generico basato su struct gestisce forse 100-200 MB/s; sonic gestisce 1-2 GB/s.
  • Streaming per JSON grandi. Un file JSON da 1 GB non sta in memoria. json.Decoder.Token() legge token per token. json.Decoder.More() percorre gli elementi dell'array uno alla volta. Usa lo streaming per file di log, dataset grandi, flussi ND-JSON (un oggetto JSON per riga, usato da OpenSearch, BigQuery, API ChatGPT).

Dove la conversione JSON-to-Go fa risparmiare tempo reale

  • Integrazione API REST. Stripe, GitHub, Slack, Notion restituiscono tutti JSON profondamente annidato. Prendere una risposta di esempio e incollarla in json-to-go produce l'80-90% della struct finale. Spendi il tempo risparmiato sul restante 10% (unmarshaller personalizzati per formati temporali, semantica omitempty, campi pointer opzionali).
  • Gestori webhook. Un payload webhook Stripe tipico ha 80-200 campi con 3-5 livelli di annidamento. Scrivere a mano la struct Go richiede 30-60 minuti; incollare il payload di esempio via json-to-go richiede 30 secondi.
  • Parsing configurazione. File di configurazione JSON (preferiti al TOML da AWS Lambda, Docker Compose compose.json, devcontainer.json) mappano puliti su struct Go. encoding/json gestisce sia la lettura sia la scrittura del file con la stessa struct.
  • Ponti gRPC e Protobuf. I tipi Go protobuf generati includono tag json. Quando si fa transcoding tra protobuf e JSON (gRPC-Gateway, Buf, Connect), json-to-go aiuta a abbozzare il lato Go dal formato wire JSON.
  • Colonne JSONB del database. PostgreSQL jsonb, documenti MongoDB, colonne JSON MySQL. Il driver database/sql restituisce []byte che fai unmarshal in struct. I generatori accelerano la prima passata per tabelle schema-on-read.
  • Dati fixture per i test. Una vera risposta JSON di produzione diventa la fixture di test. json-to-go ti dà la struct in cui fare unmarshal per le asserzioni. Combinato con le directory testdata/ (convenzione Go dal 1.10), tiene i test vicini alla realtà.
  • Pipeline CSV-a-JSON-a-struct. Per compiti di data engineering: leggi CSV, marshal a JSON per ispezione, incolla in json-to-go per ottenere la struct, poi scrivi una pipeline tipizzata. Molto più veloce che indovinare i tipi di colonna da un foglio di calcolo.

Errori comuni dopo la generazione delle struct

  • Dimenticare la gestione di time.Time. encoding/json assume il formato RFC 3339 (2026-05-13T12:34:56Z). La maggior parte delle API fornisce questo ma alcune usano timestamp Unix (Stripe), ISO senza fuso orario (vecchie API Microsoft), o stringhe personalizzate. Per non-RFC-3339, definisci un tipo personalizzato con un metodo UnmarshalJSON.
  • Overflow di interi con float64 di default. Un numero JSON parsato in interface{} diventa float64; i numeri sopra 2^53 perdono precisione. Gli ID cliente Stripe, snowflake Twitter, utenti Discord (tutti 64-bit) richiedono json.Number o int64 nella tua struct. Usa json.Decoder.UseNumber() per parsing sicuro in interface{}.
  • Fraintendere omitempty. omitempty omette il campo al marshal se è il valore zero (stringa vuota, 0, pointer nil, slice/map vuota). Non significa «opzionale all'unmarshal». Un campo int con valore 0 è indistinguibile da uno mancante; usa *int se devi sapere se l'API ha omesso il campo o inviato zero.
  • Mismatch di case dei nomi di campo. I campi Go devono essere esportati (capitalizzati) per essere marshalati. Il nome JSON di default è il nome Go letteralmente, quindi UserID diventa «UserID» in JSON a meno che taggato. I generatori aggiungono tag json:«userId» per fare da ponte tra PascalCase di Go e camelCase di JSON. Dimenticare il tag significa che il tuo codice «funziona» con se stesso ma fallisce contro API esterne.
  • Uso eccessivo di tipi pointer. I generatori a volte usano *string o *int di default per sicurezza. Questo fa sì che ogni accesso richieda un controllo nil. Se l'API garantisce che il campo è sempre presente (leggi la doc API), usa il tipo valore e salta l'indirezione.
  • Tipi incoerenti tra risposte. Alcune API restituiscono tags: []string{«foo»} in una risposta e tags: «foo» come stringa in un'altra. La pura generazione di codice non può fare da ponte. Scrivi un UnmarshalJSON personalizzato che gestisca entrambi i casi, o ripiega su interface{} e documenta la variabilità.
  • Eliminazione silenziosa di campi sconosciuti. Di default, json.Unmarshal ignora le chiavi JSON assenti dalla struct. È spesso un bug: l'API ha aggiunto un campo, il tuo codice non lo sa. Usa decoder.DisallowUnknownFields() nei test per cogliere drift; in produzione tienilo permissivo.

Altre domande frequenti

In cosa differisce questo dal canonico mholt/json-to-go?

Stesso algoritmo di base: parsare JSON, inferire tipi dalla prima occorrenza di ogni campo, generare una struct con campi taggati tra backtick. Questa implementazione gira interamente nel tuo browser senza analytics o chiamate di rete; il canonico è ospitato su mholt.github.io/json-to-go, anch'esso solo-browser ma su un dominio diverso. L'output dovrebbe corrispondere per il ~95% degli input; i casi limite (array di tipi misti, struct anonime profondamente annidate) possono differire leggermente. Se hai bisogno di output mholt esatto, usa quello; se hai bisogno di garanzie di privacy che il JSON non lasci mai il tuo dispositivo, usa questo.

Perché alcuni campi sono generati come interface{}?

Tre ragioni abituali. Primo, null letterale nel JSON sorgente: il generatore non può inferire un tipo utile da null da solo, quindi ripiega su interface{}. Sostituisci con un pointer tipizzato (*string, *int) una volta che conosci lo schema reale. Secondo, array di tipi misti: [1, «two», true] non può essere uno slice tipizzato. Terzo, campo completamente mancante nel tuo campione, incolla JSON più rappresentativo se disponibile. In Go 1.18+ puoi sostituire interface{} con l'alias più pulito any; sono identici a livello di tipo.

Posso fare un round-trip del JSON attraverso questa struct senza perdita di dati?

Generalmente sì, con riserve. encoding/json preserva i valori dei campi ma non l'ordine dei campi (la spec JSON dice che l'ordine dei campi è irrilevante; le map Go sono deliberatamente casuali). Precisione numerica: gli int64 sopra 2^53 fanno round-trip sicuri in int64 Go, ma se fai cast a float64 o passi attraverso JavaScript (ad esempio intermediario browser), perdi cifre. I campi JSON sconosciuti vengono silenziosamente eliminati all'unmarshal-poi-remarshal, preservali con un catch-all map[string]json.RawMessage se la fedeltà del round-trip conta.

Quando dovrei usare codice struct generato (easyjson, sonic) invece di encoding/json?

Di default, encoding/json, è sufficiente per il 95% dei servizi e viene fornito con il linguaggio. Passa a easyjson o sonic quando hai fatto profiling e il marshalling JSON appare nel tuo flame graph CPU al >10% del tempo totale. Punti di switch tipici: servizi HTTP che gestiscono migliaia di richieste al secondo, aggregatori di log che ingeriscono GB/ora, flussi in tempo reale. Entrambe le alternative mantengono le stesse definizioni di struct e tag, quindi puoi scambiarle senza cambiare le dichiarazioni dei campi.

Il mio JSON viene inviato a un server?

No. Il parsing JSON e la generazione di codice Go girano entrambi in JavaScript sul tuo dispositivo. Apri la scheda Network in DevTools mentre incolli; vedrai zero richieste in uscita. Sicuro per risposte API proprietarie, fixture di dati cliente, payload webhook con PII, e tutto ciò coperto da NDA.