Modulelessen (4/5)
Veldtags en JSON
Tags op struct-velden zijn metadatareeksen, gelezen via reflectie
door bibliotheken zoals encoding/json, encoding/xml, validators, ORM's. Zij
worden tussen backticks (onbewerkte tekenreeks) geschreven, direct na het veldtype.
Syntaxis
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Formaatconventie: key:"value" gescheiden door spaties (NIET
komma's) voor meerdere sleutels:
type User struct {
Email string `json:"email" validate:"required,email"`
}json-tag: opties
De meest gebruikelijke optie is json, gebruikt door encoding/json:
| Label | Effect |
|---|---|
json:"nome" | Hernoemt het veld naar nome in de JSON-uitvoer |
json:"nome,omitempty" | Laat het veld weg als het de nulwaarde heeft |
json:"-" | Dit veld niet serialiseren/deserialiseren |
json:",omitempty" | Behoudt de Go-veldnaam, maar met 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 is weggelaten (nulwaarde 0 + omitempty); Password is
geheel uitgesloten.
Maarschalk en Unmaarschalk
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal accepteert alleen een pointer, omdat deze in het
waardevelden.
Andere veel voorkomende tags
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— go-speeltuin/validatorform:"..."— gin / echo-binding
Bibliotheken lezen ze via reflectie (reflect.StructTag.Get("json")):
het zijn slechts strings totdat iemand ze interpreteert.
Probeer het
Voeg de json:"nome"-tag toe aan het veld Naam en de json:"eta"-tag aan het veld Leeftijd.
Toon hint
Tags zijn onbewerkte tekenreeksen tussen backticks direct na het veldtype.
Oplossing beschikbaar na 3 pogingen
Voeg de weglatingsoptie toe aan het veld Leeftijd: deze moet worden weggelaten als deze 0 is.
Toon hint
Opties komen na de naam, gescheiden door een komma: json:"nome,omitempty".
Oplossing beschikbaar na 3 pogingen
Wat wordt er afgedrukt met de tags json:"nome" en json:"eta"?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Samenvatten
- Tags zijn onbewerkte tekenreeksen tussen backticks:
`key:"value" key2:"value2"`. json:"nome": hernoemen.omitempty: weglaten als nulwaarde.-: uitsluiten.- NIET-geëxporteerde velden (kleine letters) worden genegeerd door
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(aanwijzer).- Hetzelfde mechanisme voor
xml,yaml,db,validate,form, …