Convertisseur JSON vers Struct Go

Collez un objet JSON (ou un tableau JSON) pour générer automatiquement les définitions de struct Go correspondantes avec leurs balises json.

Astuces d'utilisation

  • Lorsque tous les éléments d'un tableau sont des objets, leurs clés sont fusionnées en une seule struct. Les clés absentes de certains éléments reçoivent automatiquement la balise json `omitempty`.
  • Le nom du type racine est "Root" par défaut, mais vous pouvez le renommer comme vous le souhaitez. Les noms de struct pour les objets imbriqués sont générés automatiquement en convertissant le nom de la propriété en PascalCase.
  • La valeur null de JSON est générée sous forme de `interface{}`, car Go n'a pas de type primitif natif acceptant null. Envisagez un type pointeur si vous avez besoin d'un traitement plus strict.
  • Le résultat est un brouillon aux colonnes légèrement alignées. Le passer dans `gofmt` après collage l'alignera sur le style standard de votre projet.
  • Collez telle quelle une réponse JSON d'exemple de votre API pour obtenir rapidement une ébauche de la struct de réponse utilisée dans votre code Go.

Questions fréquentes

Écrire une struct à la main à partir d'une réponse d'exemple prend du temps et est source d'erreurs : il est facile de se tromper dans la conversion d'un nom de champ ou d'oublier une balise json, surtout avec des objets très imbriqués. La génération automatique fait gagner beaucoup de temps d'implémentation et évite ces erreurs.

Les clés JSON (en snake_case ou camelCase) sont converties en PascalCase avec une majuscule initiale, ce qui donne des noms de champs exportables en Go. La clé JSON d'origine est conservée telle quelle dans la balise json (`json:"clé_originale"`), si bien que l'encodage et le décodage continuent de fonctionner correctement.

Une valeur null est générée sous le type `interface{}`. Une clé présente seulement dans certains éléments d'un tableau reçoit automatiquement la balise json `omitempty`, mais le type Go lui-même ne prend que sa valeur zéro : envisagez un type pointeur si vous devez distinguer "absent" de "zéro".

Un nombre JSON avec un point décimal est classé en `float64`, et sans point décimal en `int`. Comme la notation numérique de JSON ne conserve que les chiffres, ajustez manuellement le type ensuite pour les valeurs assez grandes pour nécessiter `int64`.

Comme Go n'a pas de types union, une clé dont le type diffère selon les éléments retombe sur `interface{}`. Il faudra alors utiliser une assertion de type à l'exécution pour déterminer le type réel de la valeur.
ツールくん

Anecdote — pourquoi Go associe structs et balises json

Go est un langage à typage statique, et lorsqu'il manipule du JSON, le paquet `encoding/json` de la bibliothèque standard s'appuie sur la correspondance entre les champs d'une struct et leurs balises json pour encoder et décoder les données. Écrire à la main une struct pour la forme de réponse d'une API externe est une tâche répétitive qui s'alourdit à chaque champ ajouté, et elle revient sans cesse dans de nombreux projets Go.

Cet outil analyse la structure d'un JSON d'exemple et génère automatiquement les définitions de struct et les balises json correspondantes, réduisant ainsi ce travail répétitif. Un outil connu dans le même domaine est quicktype, qui prend en charge la conversion vers des types de plusieurs langages ; mais pour le cas plus simple où l'on veut coller une réponse d'API d'exemple et obtenir rapidement une struct Go, un outil dédié à cette seule tâche a aussi son propre confort.

Comme Go ne dispose d'aucune fonctionnalité de langage pour rendre un champ de struct optionnel, l'approche courante pour les champs JSON susceptibles d'être absents consiste à ajouter `omitempty` à la balise json, ou à utiliser un type pointeur (comme `*string`) pour distinguer une valeur zéro de "aucune valeur". La struct générée n'est qu'une déduction mécanique à partir de la structure : il est donc d'usage de vérifier et d'ajuster manuellement la question du nullable et des évolutions futures de l'API par rapport à la spécification réelle.