YamlBox

Générateurs de codes · 5 minutes de lecture

JSON to Go : des structures qui se désassemblent du premier

Go vous fait écrire la forme du JSON que vous décodez, et le compilateur vous y oblige. Une conversion JSON to Go à partir d'une réponse réelle supprime à la fois la saisie et les conjectures : les noms de champs, les balises `json` et les types imbriqués arrivent correctement, et vous pouvez accéder directement à la partie du programme qui fait réellement quelque chose.

Mis à jour

La forme générée

Un convertisseur transforme chaque objet JSON en struct, chaque tableau en tranche, et en déduit un type Go par valeur. Les objets imbriqués deviennent des types nommés plutôt que des blobs anonymes, ce qui permet de conserver la signature de votre code de décodage lisible :

                type Container struct {
  Name  string `json:"name"`
  Image string `json:"image"`
  Ports []struct {
    ContainerPort int `json:"containerPort"`
  } `json:"ports"`
}
              

Les balises `json` sont la partie importante. Le décodeur de Go ne respecte pas la casse lors de la correspondance des noms de champs, mais `containerPort` et `ContainerPort` ne s'alignent pas sans balise, et toute clé qui n'est pas un identifiant Go valide — `app.kubernetes.io/name`, par exemple — ne peut pas être mise en correspondance sans une balise.

Les nombres, les valeurs nulles et les deux pièges classiques

  • Nombres — l'inférence produit `int` pour les valeurs entières, mais JSON n'a pas de type entier. Un champ qui vaut `3` aujourd'hui peut être `3.5` demain, donc les pièces d'identité et l'argent sont plus sûrs en tant que `float64`, `string` ou `json.Number` selon vos besoins.
  • Nulls — une clé qui peut être `null` doit être un pointeur (`*string`) afin que vous puissiez distinguer « absent » de « vide ».
  • Horodatages — une chaîne RFC 3339 se décode proprement en `time.Time` ; un numéro d'époque Unix ne le fait pas, alors conservez-le sous la forme `int64` et convertissez-le explicitement.
  • Champs inconnus — `json.Decoder` ignore les extras par défaut ; utilisez `DisallowUnknownFields` lorsque vous préférez échouer bruyamment.

Générez à partir de deux ou trois réponses lorsque vous le pouvez. Les champs qui manquent parfois deviennent des indicateurs, et cette décision est beaucoup plus facile à prendre à partir de preuves que de mémoire.

De la structure au code de travail

Avec les structures en place, le décodage s'effectue sur trois lignes et le compilateur applique les chemins d'accès à partir de là. Un modèle courant consiste à décoder la structure générée, puis à la mapper dans votre type de domaine afin que la forme JSON puisse changer sans se répercuter dans l'application. Marquez le fichier généré avec le point de terminaison dont il provient et régénérez-le lorsque la réponse change plutôt que de le modifier à la main – le code généré manuellement est la version que personne n'ose régénérer plus tard.

Générer localement

Les charges utiles à partir desquelles générer des structures Go sont généralement de vraies réponses API, et les vraies réponses contiennent des jetons et des données client. Une conversion JSON to Go basée sur un navigateur conserve la charge utile dans l'onglet (pas de téléchargement, pas de question de rétention), ce qui fait de la génération à partir des données de production une étape normale plutôt qu'une exception politique.

JSON à emporter — questions fréquemment posées

Pourquoi mes structures Go ne décodent-elles pas JSON ?

Les noms de champs dans JSON correspondent rarement exactement aux noms exportés par Go, donc la structure a besoin de `json` balises. Régénérez avec les balises activées, confirmez l'orthographe de la clé, y compris la ponctuation, et vérifiez si le décodeur doit autoriser les champs inconnus.

Les champs numériques générés doivent-ils être int ou float64 ?

Utilisez `float64` — ou `json.Number` lorsque la précision compte — pour tout élément provenant d'un API externe, car JSON ne distingue pas les entiers des décimales. Réservez `int` pour les valeurs que vous contrôlez de bout en bout.

Comment gérer un champ parfois nul ?

Faites-en un type de pointeur tel que `*string`, qui code à la fois « clé absente » et « clé présente avec une valeur nulle » tout en vous permettant de vérifier une valeur réelle. Les champs sans pointeur deviennent silencieusement des valeurs nulles.

Outils mentionnés dans cet article

Parcourez la liste complète des 19 outils

Plus d'articles à lire

Tous les 19 messages →