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
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):
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:
| Etiket | Efekt |
|---|---|
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 |
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
// 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/xmlyaml:"..."— yaml.v3db:"..."— sqlx / pgxvalidate:"..."— 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
Ad alanına json:"nome" etiketini ve Yaş alanına json:"eta" etiketini ekleyin.
İpucu göster
Etiketler, alan türünden hemen sonra geri tıklamalar arasındaki ham dizelerdir.
3 denemeden sonra çözüm mevcut
Yaş alanına ihmal seçeneğini ekleyin: 0 olduğunda ihmal edilmelidir.
İpucu göster
Seçenekler adından sonra virgülle ayrılmış olarak gelir: json:"nome,omitempty".
3 denemeden sonra çözüm mevcut
Json:"nome" ve json:"eta" etiketleriyle ne yazdırıyor?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Ö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, …