100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in Go — struct pronte per il tuo file

Trasforma un campione JSON in struct Go con i tag json. Le colonne escono allineate come le lascerebbe gofmt: incollare non richiede alcuna pulizia.

Istantaneo Privato Zero cookie

Input JSON

Output Go

Che cosa fa questo strumento

Un campione JSON diventa struct Go, una per oggetto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
type Root struct {
	Id        int     `json:"id"`
	FirstName string  `json:"firstName"`
	Address   Address `json:"address"`
}

type Address struct {
	City string `json:"city"`
}

Le colonne sono allineate come le allinea gofmt — nome, tipo, tag. Nessuno legge Go non formattato, e incollare questo in un file e lanciare gofmt non dovrebbe cambiare nulla.

Quell’allineamento è recente: i campi uscivano separati da un solo spazio. Una piccola cosa, e restava un’uscita che non somigliava al linguaggio di cui si dice.

I nomi sono esportati, le chiavi vivono nel tag

encoding/json ignora del tutto i campi non esportati: un campo minuscolo non decodifica nulla e non codifica nulla, senza dire una parola. Perciò ogni campo è esportato — PascalCase, con una F davanti quando la chiave comincia con una cifra (2fa dà F2fa) — e il tag porta la chiave originale, intatta.

Due chiavi che producono lo stesso nome Go — user-name e userName — restano distinte grazie a un suffisso numerato. I tag restano diversi: ogni campo corrisponde ancora alla propria chiave.

omitempty omette più di quanto si creda

L’opzione aggiunge ,omitempty a ogni tag. Vale solo in codifica e non distingue «assente» da «zero»: 0, "", false, uno slice vuoto e una map nil spariscono tutti dall’uscita.

Va benissimo per un filtro facoltativo, ed è sbagliato per un punteggio che può valere zero legittimamente. Dove la differenza conta, la risposta abituale è un puntatore — *int — che codifica null per nil e uno zero vero altrimenti.

I tipi, e ciò che un campione non può dire

  • Gli interi diventano int, non int64. Su ogni piattaforma a 64 bit è la stessa cosa; un valore che la supera fallisce rumorosamente in decodifica invece di essere troncato in silenzio.
  • null e i valori ignoti diventano any. Un array vuoto diventa []any, uno misto pure, salvo quando mescola interi e decimali — lì []float64 copre entrambi.
  • Nessun campo è un puntatore e nessuno è opzionale, perché un campione non può mostrarlo. Una chiave a volte assente è un *T che aggiungi tu, ed è la prima cosa da verificare contro un secondo carico.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Perché i nomi dei campi hanno l’iniziale maiuscola?
Perché `encoding/json` vede solo i campi esportati. Un `id` minuscolo verrebbe saltato in entrambe le direzioni, in silenzio: lo struct compilerebbe, non decodificherebbe nulla in quel campo e non codificherebbe nulla da esso. Il tag conserva la chiave originale, quindi `Id int `json:"id"`` legge e scrive esattamente ciò che il tuo documento contiene.
Che cosa fa davvero l’opzione omitempty?
Aggiunge `,omitempty` a ogni tag, il che lascia fuori un valore zero **in codifica**. Non cambia nulla in decodifica e non distingue una chiave assente da uno zero: `0`, `""`, `false` e uno slice vuoto spariscono tutti dall’uscita. Se uno zero vero conta, un campo puntatore è la risposta abituale.
Il mio campo deve chiamarsi `Id` o `ID`?
La guida di stile di Go dice `ID`, e i linter lo diranno pure. Questo strumento scrive `Id`, ricavato meccanicamente dalla chiave, perché rinominare le sigle presuppone tenere un elenco — `ID`, `URL`, `API`, `HTTP` — e applicarlo a chiavi mai viste. Il tag rende il rinomino innocuo: è una modifica sicura da fare tu.

Convertitori correlati