Ana içeriğe geç
Modül 5 · Ders 4 ders 5Kurstaki 24/50~12 min
Modül dersleri (4/5)

Alan etiketleri ve JSON

Yapı alanlarındaki Etiketler meta veri dizeleridir ve yansıma yoluyla okunur encoding/json, encoding/xml, doğrulayıcılar, ORM'ler gibi kütüphaneler tarafından. onlar alan türünden hemen sonra geri tırnak (ham dize) arasına yazılır.

Sözdizimi

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

Biçim kuralı: key:"value" boşluklarla ayrılmış (DEĞİL birden fazla anahtar için virgül):

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

json etiketi: seçenekler

En yaygın seçenek, encoding/json tarafından kullanılan json'dir:

EtiketEfekt
json:"nome"JSON çıktısında alanı nome olarak yeniden adlandırır
json:"nome,omitempty"Sıfır değerindeyse alanı atlar
json:"-"Bu alanı serileştirmeyin/seri durumdan çıkarmayın
json:",omitempty"Go alan adını korur ancak 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 atlandı (sıfır değeri 0 + omitempty); Password: tamamen hariç tutuldu.

Mareşal ve Mareşal

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

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

Unmarshal yalnızca bir işaretçiyi kabul eder çünkü işaretçinin içine yazması gerekir. değer alanları.

Diğer yaygın etiketler

  • xml:"..." — encoding/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / pgx
  • validate:"..." — oyun alanı/doğrulayıcı
  • form:"..." — cin/eko bağlama

Kütüphaneler bunları yansıma yoluyla okur (reflect.StructTag.Get("json")): Birisi onları yorumlayana kadar bunlar sadece dizelerdir.

Deneyin

Egzersiz#go.m5.l4.e1
Denemeler: 0Yükleniyor…

Ad alanına json:"nome" etiketini ve Yaş alanına json:"eta" etiketini ekleyin.

Düzenleyici yükleniyor…
İpucu göster

Etiketler, alan türünden hemen sonra geri tıklamalar arasındaki ham dizelerdir.

3 denemeden sonra çözüm mevcut

Egzersiz#go.m5.l4.e2
Denemeler: 0Yükleniyor…

Yaş alanına ihmal seçeneğini ekleyin: 0 olduğunda ihmal edilmelidir.

Düzenleyici yükleniyor…
İpucu göster

Seçenekler adından sonra virgülle ayrılmış olarak gelir: json:"nome,omitempty".

3 denemeden sonra çözüm mevcut

Quiz#go.m5.l4.e3
Hazır

Json:"nome" ve json:"eta" etiketleriyle ne yazdırıyor?

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

Özet

  • Etiketler geri tırnaklar arasındaki ham dizelerdir: `key:"value" key2:"value2"`.
  • 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, db, validate, form, …