Conversione da JSON a struttura Go

Incollando un oggetto o un vettore JSON, genera automaticamente la corrispondente definizione di struttura Go con le relative etichette json.

Consigli per l'uso

  • Se tutti gli elementi di un vettore sono oggetti, le loro chiavi vengono fuse in un'unica struttura; alle chiavi presenti soltanto in alcuni elementi si aggiunge automaticamente l'opzione `omitempty`.
  • Il nome del tipo radice, inizialmente «Root», si può cambiare a piacere. I nomi delle strutture annidate sono generati automaticamente convertendo in maiuscole iniziali il nome della proprietà.
  • Il valore null del JSON diventa `interface{}`, perché Go non dispone di tipi elementari annullabili. Se vi occorre un trattamento rigoroso, valutate la sostituzione con un tipo puntatore.
  • Il risultato è prodotto con una formattazione semplice a rientri allineati; passandolo poi attraverso `gofmt` lo uniformerete allo stile del vostro progetto.
  • Incollando senz'altro un JSON di esempio preso da una risposta reale, otterrete in un attimo una prima stesura della struttura Go per le risposte.

Domande frequenti

Scriverle a mano espone a errori nella conversione dei nomi dei campi e a dimenticanze nelle etichette json, e con oggetti profondamente annidati richiede molto tempo. La generazione automatica previene questi errori e abbrevia sensibilmente la realizzazione.

Le chiavi JSON, scritte con i trattini bassi o con le maiuscole interne, sono convertite in maiuscole iniziali per ottenere nomi di campo esportabili in Go. La chiave originaria resta comunque nell'etichetta json, nella forma `json:"chiave originaria"`, cosicché codifica e decodifica funzionano senza problemi.

I valori nulli diventano di tipo `interface{}`. Alle chiavi presenti soltanto in alcuni elementi di un vettore si aggiunge automaticamente l'opzione `omitempty` nell'etichetta json, ma poiché il tipo Go assume comunque il proprio valore nullo, valutate all'occorrenza la sostituzione con un tipo puntatore.

Se il numero nel JSON contiene un separatore decimale si assegna il tipo in virgola mobile a doppia precisione, altrimenti il tipo intero. Poiché nella notazione JSON resta soltanto l'informazione sulle cifre, i valori tanto grandi da richiedere un intero a 64 bit vanno corretti a mano dopo la generazione.

Non esistendo in Go i tipi unione, quando una stessa chiave presenta tipi discordanti da un elemento all'altro si ripiega su `interface{}`. Il tipo effettivo va poi determinato in esecuzione con un'asserzione di tipo.
Tool-kun

A proposito — la scelta progettuale delle strutture Go e delle etichette json

Go è un linguaggio a tipizzazione statica e, nel trattare il JSON, il pacchetto standard di codifica esamina la corrispondenza fra i campi della struttura e le etichette json per svolgere codifica e decodifica. Trascrivere a mano come struttura il formato delle risposte di un'interfaccia esterna è un lavoro ripetitivo che cresce con il numero dei campi e che innumerevoli progetti in Go hanno dovuto affrontare.

Questo strumento analizza la struttura di un JSON di esempio e genera automaticamente la definizione corrispondente con le etichette json, alleggerendo quel lavoro. Fra gli strumenti dello stesso genere è noto quicktype, che genera tipi per più linguaggi; quando però si vuole soltanto incollare la risposta che si ha sotto mano e ottenere in fretta una struttura Go, la semplicità di uno strumento monofunzione ha i suoi vantaggi.

Go non offre alcun costrutto per rendere facoltativo un campo di una struttura: per i campi che nel JSON possono mancare si usa perciò l'opzione `omitempty` nell'etichetta oppure un tipo puntatore, come `*string`, per distinguere il valore nullo dall'assenza di valore. La struttura generata è soltanto una deduzione meccanica a partire dalla forma dei dati: stabilire quali campi siano annullabili e progettare in vista dei futuri cambiamenti dell'interfaccia resta un lavoro da svolgere a mano, confrontandosi con la documentazione.