Lecții din modul (4/5)
Etichete de câmp și JSON
Etichetele din câmpurile struct sunt șiruri de metadate, citite prin reflectare
de biblioteci precum encoding/json, encoding/xml, validatoare, ORM-uri. Ei
sunt scrise între backticks (șir brut) imediat după tipul câmpului.
Sintaxă
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Convenție de format: key:"value" separate prin spații (NU
virgule) pentru mai multe chei:
type User struct {
Email string `json:"email" validate:"required,email"`
}json tag: opțiuni
Cea mai comună opțiune este json, folosită de encoding/json:
| Etichetă | Efect |
|---|---|
json:"nome" | Redenumește câmpul în nome în ieșirea JSON |
json:"nome,omitempty" | Omite câmpul dacă este la valoarea sa zero |
json:"-" | Nu serializați/dezerializați acest câmp |
json:",omitempty" | Păstrează numele câmpului Go, dar cu 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 este omis (valoarea zero 0 + omitempty); Password este
exclus în întregime.
Mareșal și Unmarshal
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal acceptă doar un pointer, deoarece trebuie să scrie în
câmpurile valorii.
Alte etichete comune
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— loc de joacă/validatorform:"..."— legarea gin / echo
Bibliotecile le citesc prin reflecție (reflect.StructTag.Get("json")):
sunt doar șiruri până când cineva le interpretează.
Încearcă
Adăugați eticheta json:"nome" în câmpul Nume și eticheta json:"eta" în câmpul Vârstă.
Afișează indiciu
Etichetele sunt șiruri brute între backtick-uri imediat după tipul câmpului.
Soluție disponibilă după 3 încercări
Adăugați opțiunea de omitere în câmpul Vârstă: trebuie omisă când este 0.
Afișează indiciu
Opțiunile vin după nume, separate prin virgulă: json:"nome,omitempty".
Soluție disponibilă după 3 încercări
Ce se imprimă cu etichetele json:"nome" și json:"eta"?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Recapitulare
- Etichetele sunt șiruri brute între backtick-uri:
`key:"value" key2:"value2"`. json:"nome": redenumiți.omitempty: omiteți dacă valoarea zero.-: excludeți.- Câmpurile NEexportate (minuscule) sunt ignorate de
encoding/json. json.Marshal(v)↔json.Unmarshal(data, &v)(indicator).- Același mecanism pentru
xml,yaml,db,validate,form, …