Vai al contenuto

Da JSON a struct Go

JSON to Go Structs

Genera struct Go con i tag json a partire da un esempio JSON, compresi i tipi annidati e ripetuti.

Genera struct Go con i tag `json:` a partire da un documento di esempio, così un corpo di risposta diventa qualcosa in cui `encoding/json` può fare l’unmarshal. I nomi dei campi sono esportati e in camel case, e la chiave originale resta nel tag, che è la parte che a mano si sbaglia.

🔒 Funziona interamente nel tuo browsergojsoncodegenstruct
Produci

JSON di esempio

Trascina un file .json

Letto in questa scheda. Non viene caricato niente.

Dagli tutti gli elementi che hai. Ogni record in più restringe la deduzione: un campo che manca in uno di loro è proprio quello che lo rende facoltativo.

TypeScript

Come si usa

  1. Incollare tutti i record che si hanno

    Viene letto e fuso ogni elemento di ogni array, non solo il primo. Tre record dicono molto più di uno, perché un campo che manca in uno di essi è esattamente ciò che rende quel campo facoltativo.

  2. Dare un nome al tipo radice

    Gli oggetti annidati prendono il nome dalla chiave che li contiene, al singolare per gli array, così `users` produce un `User`. Solo la radice ha bisogno di un nome dato a mano.

  3. Leggere i conteggi sotto l’uscita

    Tipi, campi facoltativi, unioni e quanti record sono stati fusi. Un conteggio di unioni sopra lo zero vuol dire che nel campione un campo ha contenuto due generi di valore diversi — vale la pena guardarlo prima di incollare il risultato in una base di codice.

  4. Incollare le struct in un package

    I campi che mancavano da alcuni record ricevono `,omitempty` nel loro tag, così un giro di marshal e ritorno non se li inventa. Non viene emessa nessuna clausola di package: si sa già dove andranno a finire.

Domande frequenti

Perché ogni numero è `float64`?

Solo quando il campione aveva un valore con la virgola. Se ogni numero del documento era intero, il campo viene emesso come tipo intero. Non c’è modo di distinguere un `1` JSON che è un id da un `1` JSON che è un prezzo arrotondato, quindi il campione è tutta la prova che c’è.

E un campo che in alcuni record è null?

Diventa un tipo puntatore, che è il modo in cui Go distingue «assente o null» da «zero». Vuol dire che dereferenziarlo richiede un controllo su nil — è seccante, ed è il motivo per cui l’alternativa, un valore semplice che in silenzio si legge come 0 o "", è peggio.

Gestisce una chiave che non è un identificatore Go valido?

Il nome del campo viene ripulito — separatori tolti, ogni parte con l’iniziale maiuscola — e la chiave grezza resta nel tag `json:`, che è quello che fa davvero la corrispondenza. Una chiave `user-id` diventa qualcosa come `UserID` con accanto `json:"user-id"`.

Vengono prodotti campi `time.Time`?

No. Un timestamp in JSON è una stringa, e trasformarlo in `time.Time` cambierebbe quello che l’unmarshal accetta. Chi lo vuole cambia il tipo del campo a mano: `encoding/json` analizza già da sé l’RFC 3339 in `time.Time`.

Può ricevere da

Dopo

Questi accettano ciò che produce questo strumento, così il risultato può passare direttamente.