Passer au contenu principal
eLearner.app
Module 5 · Leçon 4 sur 524/50 dans le cours~12 min
Leçons du module (4/5)

Tags de champs et JSON

Les balises sur les champs de structure sont des chaînes de métadonnées, lues par réflexion par des bibliothèques comme encoding/json, encoding/xml, des validateurs, des ORM. Ils sont écrits entre des backticks (chaîne brute) juste après le type du champ.

Syntaxe

Go
type User struct {
    Name string `json:"nome"`
    Age  int    `json:"eta,omitempty"`
}

Convention de format : key:"value" séparé par des espaces (PAS virgules) pour plusieurs clés :

Go
type User struct {
    Email string `json:"email" validate:"required,email"`
}

Balise json : options

L'option la plus courante est json, utilisée par encoding/json :

ÉtiquetteEffet
json:"nome"Renomme le champ en nome dans la sortie JSON
json:"nome,omitempty"Omet le champ s'il est à sa valeur zéro
json:"-"Ne pas sérialiser/désérialiser ce champ
json:",omitempty"Conserve le nom du champ Go mais avec omitempty
Go
type User struct {
    Name     string `json:"nome"`
    Age      int    `json:"eta,omitempty"`
    Password string `json:"-"`
}

u := User{Name: "Ada", Age: 0, Password: "segreto"}
b, _ := json.Marshal(u)
fmt.Println(string(b))   // {"nome":"Ada"}

Age est omis (valeur zéro 0 + omitempty) ; Password est totalement exclu.

Maréchal et démaréchal

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal n'accepte qu'un pointeur, car il doit écrire dans le les champs de la valeur.

Autres balises courantes

  • xml:"..."encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx/pgx
  • validate:"..." — go-playground/validateur
  • form:"..." — liaison gin/écho

Les bibliothèques les lisent par réflexion (reflect.StructTag.Get("json")) : ce ne sont que des chaînes jusqu'à ce que quelqu'un les interprète.

Essayez-le

Exercice#go.m5.l4.e1
Tentatives : 0Chargement…

Ajoutez la balise json:"nome" au champ Nom et la balise json:"eta" au champ Âge.

Chargement de l'éditeur…
Afficher l'indice

Les balises sont des chaînes brutes entre des backticks juste après le type de champ.

Solution disponible après 3 tentatives

Exercice#go.m5.l4.e2
Tentatives : 0Chargement…

Ajoutez l'option omitempty au champ Age : elle doit être omise lorsqu'elle vaut 0.

Chargement de l'éditeur…
Afficher l'indice

Les options viennent après le nom, séparées par une virgule : json:"nome,omitempty".

Solution disponible après 3 tentatives

Quiz#go.m5.l4.e3
Prêt

Qu'est-ce qu'il imprime avec les balises json:"nome" et json:"eta" ?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
Options de réponse

Récapitulatif

  • Les balises sont des chaînes brutes entre les backticks : `key:"value" key2:"value2"`.
  • json:"nome": rename. omitempty: omit if zero value. -: exclude.
  • NON-exported (lowercase) fields are ignored by encoding/json.
  • json.Marshal(v)json.Unmarshal(data, &v) (pointer).
  • Same mechanism for xml, yaml 0db 1validate 2form, …