JSON vers Go Struct

Suivant

Collez un exemple JSON et obtenez des définitions de struct Go qui l’analysent proprement avec encoding/json. Les champs sont exportés (CamelCase), étiquetés avec les clés JSON d’origine, promus en pointeurs lorsque la valeur peut être nulle, et les objets imbriqués obtiennent leurs propres déclarations de struct nommées.

Comment convertir JSON en struct Go

  1. 1

    Collez le JSON

    Un seul exemple suffit. Plusieurs exemples améliorent l'inférence nullable.

  2. 2

    Choisissez un nom

    PascalCase pour les champs exportés est la convention Go. Choisissez un style d'abréviation (`URL` vs `Url`, `ID` vs `Id`).

  3. 3

    Choisissez une stratégie optionnelle

    Utilisez des pointeurs pour les champs nullable (le plus idiomatique), ou des balises `omitempty`.

  4. 4

    Copiez les structs

    Une struct racine plus des imbriquées. Collez dans un fichier `.go` et appuyez sur `go build`.

Exemple de sortie

Pour :

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Sortie :

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

Mappage des types

Valeur JSON Type Go
chaîne string
entier int ou int64
nombre (décimal) float64
booléen bool
null (avec une valeur voisine non nulle) *T (pointeur)
tableau []T
objet Struct nommé
tableau mixte []interface{}

Idiomes de nommage suivis par le générateur

  • Initialismes en majuscules : id -> ID, url -> URL, api_key -> APIKey. Cela correspond au style recommandé par Go (et aux règles de go vet / staticcheck).
  • JSON snake_case -> champs PascalCase : first_name -> FirstName.
  • Acronymes d’un seul mot préservés : IP reste IP, HTTP reste HTTP.
  • Balise JSON : json:"first_name" conserve la clé d’origine pour que l’encodage soit propre.

Champs optionnels : pointeur ou omitempty ?

Stratégie Utiliser quand
Pointeur (*T) Vous devez distinguer “absent” de “valeur zéro”
omitempty Vous voulez seulement ignorer les valeurs zéro lors de la sérialisation ; la désérialisation stocke zéro pour les manquants
Aucun Le champ est toujours présent et les valeurs zéro sont significatives

Le générateur utilise par défaut pointeur + omitempty pour tout ce qui est considéré comme nul ; ajustez en fonction de votre sémantique.

Erreurs courantes

  • Utiliser int lorsque l’entier JSON dépasse MaxInt32 sur une cible 32 bits. Utilisez int64 pour les valeurs connues comme grandes.
  • Sérialiser et perdre l’ordre des clés. encoding/json émet les clés dans l’ordre de déclaration des champs, pas dans l’ordre JSON d’origine. Triez manuellement si vous avez besoin d’une sortie canonique.
  • Tableaux de formes mixtes. []interface{} perd la sécurité de type. Envisagez plutôt des types union avec un champ discriminant type.
  • Oublier omitempty sur les optionnels. Sans cela, les champs optionnels se sérialisent comme "foo": null au lieu d’être omis.

Questions fréquentes

Utilisez des pointeurs lorsque vous devez distinguer “champ absent” de “champ à zéro”. Utilisez omitempty lorsque la valeur zéro n’est pas une valeur métier valide ("", 0, false signifient toujours “ignorer ceci”). De nombreuses équipes choisissent une option et l’appliquent de manière cohérente dans une base de code.

Chaque objet imbriqué devient une déclaration de struct nommée séparée (par exemple, User -> Address). Les types sont intégrés uniquement lorsque la struct imbriquée est petite et utilisée une fois ; sinon, vous obtenez des types propres et réutilisables.

Oui. id devient ID, url devient URL, api_key devient APIKey. C’est ce que go vet attend et ce que la plupart des guides de style Go recommandent.

Le générateur émet des structs simples avec des balises json: standard. Pour des implémentations UnmarshalJSON personnalisées (par exemple, pour des dates dans des formats non-ISO), ajoutez-les manuellement après la génération.

Outils similaires

Outil disponible dans d’autres langues