Przejdź do głównej treści
eLearner.app
Moduł 5 · Lekcja 4 z 524/50 w kursie~12 min
Lekcje modułu (4/5)

Tagi pól i JSON

Tagi w polach strukturalnych to ciągi metadanych odczytywane poprzez odbicie przez biblioteki takie jak encoding/json, encoding/xml, walidatory, ORM. Oni są zapisywane pomiędzy backtickami (surowym ciągiem znaków) zaraz po typie pola.

Składnia

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

Konwencja formatu: key:"value" oddzielone spacjami (NOT przecinki) dla wielu kluczy:

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

znacznik json: opcje

Najbardziej powszechną opcją jest json, używana przez encoding/json:

OznaczEfekt
KODEF0Zmienia nazwę pola na nome w danych wyjściowych JSON
KODEF2Pomija pole, jeśli ma ono wartość zerową
KODEF3Nie serializuj/deserializuj tego pola
KODEF4Zachowuje nazwę pola Go, ale z kodem 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 jest pominięty (wartość zerowa 0 + omitempty); KODEF3 jest całkowicie wykluczone.

Marszałek i Unmarszałek

Go
// struct -> JSON
b, err := json.Marshal(u)

// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)

Unmarshal akceptuje tylko wskaźnik, ponieważ musi pisać do pola wartości.

Inne popularne tagi

  • KODEF0 — KODEF1
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — plac zabaw/walidator
  • form:"..." — wiązanie gin/echo

Biblioteki czytają je poprzez refleksję (reflect.StructTag.Get("json")): są to tylko ciągi znaków, dopóki ktoś ich nie zinterpretuje.

Spróbuj

Ćwiczenie#go.m5.l4.e1
Próby: 0Ładowanie...

Dodaj znacznik json:"nome" do pola Nazwa i znacznik json:"eta" do pola Wiek.

Ładowanie edytora...
Pokaż wskazówkę

Tagi to nieprzetworzone ciągi znaków znajdujące się pomiędzy znacznikami wstecznymi zaraz po typie pola.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m5.l4.e2
Próby: 0Ładowanie...

Dodaj opcję omitempty do pola Wiek: należy ją pominąć, jeśli wynosi 0.

Ładowanie edytora...
Pokaż wskazówkę

Opcje znajdują się po nazwie i są oddzielone przecinkiem: json:"nome,omitempty".

Rozwiązanie dostępne po 3 próbach

Quiz#go.m5.l4.e3
Gotowe

Co wypisuje ze znacznikami json: „nome” i json: „eta”?

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

Podsumowanie

  • Tagi to surowe ciągi znaków pomiędzy backtickami: `key:"wartość" klucz2:"wartość2"`.
  • 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, yaml 0db 1validate 2form, …