JSON en struct Go
Générez des structs Go à partir de JSON
À propos de l’outil JSON en struct Go
L’outil JSON en struct Go transforme un échantillon JSON ou un JSON Schema en déclarations de types Go pour encoding/json, générées par quicktype-core dans votre navigateur. Chaque objet imbriqué devient sa propre struct nommée, les noms de champs suivent le style Go, sigles compris (user_id devient UserID), et chaque champ garde la clé d’origine dans un tag json, ainsi que dans chaque autre tag que vous indiquez dans « Tags », comme yaml ou db. Les nombres entiers sont typés int64 et les nombres écrits avec une virgule décimale float64. Quand vous collez un tableau, une clé que seuls certains éléments possèdent devient un pointeur avec omitempty ; « omitempty sur chaque champ » l’ajoute à tous les champs, et « Pointeurs vers les structs imbriquées » transforme un champ comme Address en *Address. Par défaut, la sortie ne contient que les définitions de types : remplissez « Paquet » pour la faire commencer par une déclaration de paquet, et choisissez « Types et fonctions Unmarshal / Marshal » dans « Code » pour obtenir aussi une fonction Unmarshal, une méthode Marshal et les méthodes qui décodent une valeur de deux types. Le JSON peut être collé ou ouvert depuis un fichier .json ou .txt.
Exemple
Un objet avec une adresse imbriquée : l’adresse reçoit sa propre struct.
Entrée JSON
{"user_id": 42, "score": 9.5, "tags": ["go", "api"], "address": {"city": "Montreal", "zip": "H2X"}}Sortie struct Go
type Root struct {
UserID int64 `json:"user_id"`
Score float64 `json:"score"`
Tags []string `json:"tags"`
Address Address `json:"address"`
}
type Address struct {
City string `json:"city"`
Zip string `json:"zip"`
}Comment convertir du JSON en struct Go
- 1Collez le JSON, par exemple la réponse d’une API, dans « Entrée JSON », ou cliquez sur « Ouvrir un fichier » pour charger un fichier .json ou .txt. Pour un JSON Schema, choisissez « JSON Schema » dans « Source ».
- 2Indiquez le « Nom du type » et, pour une déclaration de paquet, le « Paquet » ; choisissez ensuite le « Code », les « Tags » et les cases dont vous avez besoin.
- 3Cliquez sur « Convertir » pour construire les structs dans « Sortie struct Go ».
- 4Cliquez sur « Copier », ou sur « Télécharger » pour obtenir le fichier « model.go ».
Formats et limites
- Entrée
- Texte JSON, ou JSON Schema, collé ou ouvert depuis un fichier .json ou .txt ; avec un tableau, les champs de tous les éléments sont fusionnés
- Sortie
- Déclarations de structs Go avec des tags json et les tags que vous indiquez, enregistrées sous model.go ; une déclaration de paquet et des fonctions Unmarshal / Marshal si vous les choisissez
- Types numériques
- int64 pour les nombres entiers ; float64 pour les nombres écrits avec une virgule décimale ou un exposant, comme 10.0
- Dates
- string par défaut ; time.Time quand « Dates en time.Time » est coché et qu’une valeur est une date-heure ISO 8601 comme 2024-05-01T10:00:00Z, ainsi que pour "format": "date-time" dans un JSON Schema
- Clés facultatives
- Type pointeur avec omitempty quand une clé manque dans certains éléments ; pointeur seul quand elle vaut null dans certains ; interface{} quand elle vaut null dans tout l’échantillon
- Types mélangés
- Une clé qui contient un nombre dans un élément et du texte dans un autre devient une struct avec des champs pointeurs Integer et String ; encoding/json ne peut la remplir qu’avec la méthode UnmarshalJSON qu’ajoute « Types et fonctions Unmarshal / Marshal »
Où votre JSON est traité
La génération des structs se fait dans cet onglet du navigateur. Le moteur quicktype est chargé une seule fois, à votre premier clic, et votre JSON reste sur votre ordinateur. La page envoie toutefois des rapports d’erreur : quand une ligne d’erreur rouge s’affiche, son texte, débarrassé des passages cités, des nombres longs et des adresses, est envoyé à notre journal des erreurs avec le nom de l’outil ainsi que le nom et la version de votre navigateur, et une panne inattendue de la page est signalée de la même façon.
Questions fréquentes
Un champ devient-il un pointeur quand une clé manque parfois ou vaut null ?
Oui. Une clé absente d’au moins un élément devient un pointeur avec omitempty, qui l’omet à l’encodage ; une clé qui vaut null dans un élément devient un simple pointeur, sans omitempty. Si la clé est toujours présente dans vos vraies données, remplacez *string par string à la main.
Quels types numériques utilise-t-il ?
int64 pour les nombres entiers et float64 pour les décimaux. Une valeur écrite 10.0 compte comme un décimal : elle devient float64, et un 10.5 reçu plus tard se décode encore. Passez vous-même à int ou int32 si vos valeurs sont petites.
Comment nomme-t-il les champs issus de clés en snake_case ?
Il les transforme en noms Go exportés et garde la clé dans le tag : user_id devient UserID, et son tag indique toujours user_id, si bien qu’encoding/json lit et écrit la clé d’origine sans la changer.
Peut-il générer une struct pour un tableau JSON ?
Oui. Un tableau de premier niveau donne type Root []RootElement, et les champs de tous les éléments sont fusionnés dans RootElement : il suffit d’un élément sans une clé pour que cette clé devienne facultative.
Peut-il écrire la déclaration de paquet et une fonction Unmarshal ?
Oui. Tapez le nom du paquet dans « Paquet », par exemple main ou model, pour que le code commence par sa déclaration. Choisissez « Types et fonctions Unmarshal / Marshal » dans « Code » pour obtenir aussi une fonction qui lit le JSON, comme UnmarshalRoot(data), une méthode Marshal, les imports dont elles ont besoin, et les méthodes UnmarshalJSON et MarshalJSON d’une valeur de deux types ; ce choix demande un nom de paquet.
Puis-je ajouter omitempty à chaque champ, ou d’autres tags que json ?
Oui. Cochez « omitempty sur chaque champ » pour que les valeurs vides soient omises à l’encodage. Indiquez d’autres clés de tag dans « Tags », séparées par des virgules, par exemple json,yaml ou json,db : chaque champ reçoit alors un tag par clé, chacun avec la clé d’origine.
Puis-je partir d’un JSON Schema ?
Oui. Choisissez « JSON Schema » dans « Source », puis collez ou ouvrez le schéma. Les types, les propriétés obligatoires (les autres deviennent des pointeurs avec omitempty), les enums (un type string avec ses constantes) et les formats date-time (time.Time) viennent du schéma. Un $ref n’est suivi qu’à l’intérieur du document (#/definitions/… ou #/$defs/…) : un schéma situé à une autre adresse n’est jamais téléchargé, et la page le signale.
Trucs et astuces
- ✓Collez deux ou trois éléments différents d’une liste d’API plutôt qu’un seul, pour que les clés parfois absentes deviennent des pointeurs.
- ✓Cochez « Pointeurs vers les structs imbriquées » quand vous devez distinguer un objet absent (nil) d’un objet vide.