100 % local — vos données ne quittent jamais votre navigateur

JSON en Go — des structs prêtes pour votre fichier

Transformez un échantillon JSON en structs Go avec tags json. Les colonnes sortent alignées comme gofmt le ferait : le collage ne demande aucun ménage.

Instantané Privé Zéro cookie

Entrée JSON

Sortie Go

Ce que fait cet outil

Un échantillon JSON devient des structs Go, une par objet.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
type Root struct {
	Id        int     `json:"id"`
	FirstName string  `json:"firstName"`
	Address   Address `json:"address"`
}

type Address struct {
	City string `json:"city"`
}

Les colonnes sont alignées comme gofmt les aligne — nom, type, tag. Personne ne lit du Go non formaté, et coller ceci dans un fichier puis lancer gofmt ne doit rien changer.

Cet alignement est récent : les champs sortaient séparés par une seule espace. Une petite chose, et c’était quand même une sortie qui ne ressemblait pas au langage dont elle se réclame.

Les noms sont exportés, les clés vivent dans le tag

encoding/json ignore entièrement les champs non exportés : un champ minuscule ne décode rien et n’encode rien, sans un mot. Chaque champ est donc exporté — PascalCase, avec un F devant quand la clé commence par un chiffre (2fa donne F2fa) — et le tag porte la clé d’origine, inchangée.

Deux clés qui produisent le même nom Go — user-name et userName — sont tenues séparées par un suffixe numéroté. Les tags restent distincts : chaque champ correspond toujours à sa propre clé.

omitempty omet plus qu’on ne croit

L’option ajoute ,omitempty à chaque tag. Elle s’applique à l’encodage seulement, et ne distingue pas « absent » de « zéro » : 0, "", false, une tranche vide et une map nulle disparaissent tous de la sortie.

C’est très bien pour un filtre facultatif, et faux pour une note qui peut légitimement valoir zéro. Là où la différence compte, la réponse habituelle est un pointeur — *int — qui encode null pour nil et un vrai 0 sinon.

Les types, et ce qu’un échantillon ne peut pas dire

  • Les entiers deviennent int, pas int64. Sur toute plateforme 64 bits c’est la même chose ; une valeur qui dépasse échoue bruyamment au décodage plutôt que d’être tronquée en silence.
  • null et les valeurs inconnues deviennent any. Un tableau vide devient []any, un tableau mêlé aussi, sauf s’il mêle entiers et flottants — []float64 couvre alors les deux.
  • Aucun champ n’est un pointeur et aucun n’est optionnel, parce qu’un échantillon ne peut pas le montrer. Une clé parfois absente est un *T que vous ajoutez, et c’est la première chose à vérifier contre une seconde charge.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi les noms de champs sont-ils capitalisés ?
Parce qu’`encoding/json` ne voit que les champs exportés. Un `id` minuscule serait ignoré dans les deux sens, en silence : la struct compilerait, ne décoderait rien dans ce champ et n’encoderait rien depuis lui. Le tag garde la clé d’origine, donc `Id int `json:"id"`` lit et écrit exactement ce que contient votre document.
Que fait vraiment l’option omitempty ?
Elle ajoute `,omitempty` à chaque tag, ce qui laisse de côté une valeur nulle **à l’encodage**. Elle ne change rien au décodage et ne distingue pas une clé absente d’un zéro : `0`, `""`, `false` et une tranche vide disparaissent tous de la sortie. Si un vrai zéro compte, un champ pointeur est la réponse habituelle.
Mon champ doit-il s’appeler `Id` ou `ID` ?
Le guide de style de Go dit `ID`, et les linters le diront aussi. Cet outil écrit `Id`, dérivé mécaniquement de la clé, parce que renommer les sigles suppose d’en tenir une liste — `ID`, `URL`, `API`, `HTTP` — et de l’appliquer à des clés qu’il n’a jamais vues. Le tag rend le renommage sans risque : c’est une retouche sûre à faire vous-même.

Convertisseurs associés