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
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 :
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 :
| Étiquette | Effet |
|---|---|
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 |
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
// 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/xmlyaml:"..."— yaml.v3db:"..."— sqlx/pgxvalidate:"..."— go-playground/validateurform:"..."— 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
Ajoutez la balise json:"nome" au champ Nom et la balise json:"eta" au champ Âge.
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
Ajoutez l'option omitempty au champ Age : elle doit être omise lorsqu'elle vaut 0.
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
Qu'est-ce qu'il imprime avec les balises json:"nome" et json:"eta" ?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))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,yaml0db1validate2form, …