Salt la conținutul principal
Modulul 5 · Lecția 4 din 524/50 în curs~12 min
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ă

Go
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:

Go
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
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 este omis (valoarea zero 0 + omitempty); Password este exclus în întregime.

Mareșal și Unmarshal

Go
// 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/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — loc de joacă/validator
  • form:"..." — legarea gin / echo

Bibliotecile le citesc prin reflecție (reflect.StructTag.Get("json")): sunt doar șiruri până când cineva le interpretează.

Încearcă

Exercițiu#go.m5.l4.e1
Încercări: 0Se încarcă…

Adăugați eticheta json:"nome" în câmpul Nume și eticheta json:"eta" în câmpul Vârstă.

Se încarcă editorul...
Afișează indiciu

Etichetele sunt șiruri brute între backtick-uri imediat după tipul câmpului.

Soluție disponibilă după 3 încercări

Exercițiu#go.m5.l4.e2
Încercări: 0Se încarcă…

Adăugați opțiunea de omitere în câmpul Vârstă: trebuie omisă când este 0.

Se încarcă editorul...
Afișează indiciu

Opțiunile vin după nume, separate prin virgulă: json:"nome,omitempty".

Soluție disponibilă după 3 încercări

Quiz#go.m5.l4.e3
Gata

Ce se imprimă cu etichetele json:"nome" și json:"eta"?

Go
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))
Opțiuni de răspuns

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