Direct naar de hoofdinhoud
Module 5 · Les 4 van 524/50 in de cursus~12 min
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

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

Formaatconventie: key:"value" gescheiden door spaties (NIET komma's) voor meerdere sleutels:

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

json-tag: opties

De meest gebruikelijke optie is json, gebruikt door encoding/json:

LabelEffect
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
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 is weggelaten (nulwaarde 0 + omitempty); Password is geheel uitgesloten.

Maarschalk en Unmaarschalk

Go
// 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/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — go-speeltuin/validator
  • form:"..." — gin / echo-binding

Bibliotheken lezen ze via reflectie (reflect.StructTag.Get("json")): het zijn slechts strings totdat iemand ze interpreteert.

Probeer het

Oefening#go.m5.l4.e1
Pogingen: 0Laden…

Voeg de json:"nome"-tag toe aan het veld Naam en de json:"eta"-tag aan het veld Leeftijd.

Editor laden…
Toon hint

Tags zijn onbewerkte tekenreeksen tussen backticks direct na het veldtype.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m5.l4.e2
Pogingen: 0Laden…

Voeg de weglatingsoptie toe aan het veld Leeftijd: deze moet worden weggelaten als deze 0 is.

Editor laden…
Toon hint

Opties komen na de naam, gescheiden door een komma: json:"nome,omitempty".

Oplossing beschikbaar na 3 pogingen

Quiz#go.m5.l4.e3
Klaar

Wat wordt er afgedrukt met de tags json:"nome" en json:"eta"?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
Antwoordmogelijkheden

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, …