Pelajaran modul (4/5)
Tag bidang dan JSON
Tag pada bidang struct adalah string metadata, dibaca melalui refleksi
oleh perpustakaan seperti encoding/json, encoding/xml, validator, ORM. Mereka
ditulis di antara backticks (string mentah) tepat setelah jenis kolom.
Sintaksis
type User struct {
Name string `json:"nome"`
Age int `json:"eta,omitempty"`
}Konvensi format: key:"value" dipisahkan dengan spasi (BUKAN
koma) untuk beberapa kunci:
type User struct {
Email string `json:"email" validate:"required,email"`
}tag json: opsi
Opsi paling umum adalah json, digunakan oleh encoding/json:
| Tandai | Efek |
|---|---|
json:"nome" | Ganti nama bidang menjadi nome di keluaran JSON |
json:"nome,omitempty" | Hilangkan bidang jika nilainya nol |
json:"-" | Jangan membuat cerita bersambung/deserialisasi bidang ini |
json:",omitempty" | Pertahankan nama kolom Go tetapi dengan 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 dihilangkan (nilai nol 0 + omitempty); Password adalah
dikecualikan seluruhnya.
Marsekal dan Unmarshal
// struct -> JSON
b, err := json.Marshal(u)
// JSON -> struct (needs a POINTER)
var u2 User
err = json.Unmarshal(b, &u2)Unmarshal hanya menerima pointer, karena harus ditulis ke dalam
bidang nilai.
Tag umum lainnya
xml:"..."—encoding/xmlyaml:"..."— yaml.v3db:"..."— sqlx / halxvalidate:"..."— buka taman bermain/validatorform:"..."— pengikatan gin / gema
Perpustakaan membacanya melalui refleksi (reflect.StructTag.Get("json")):
itu hanyalah string sampai seseorang menafsirkannya.
Cobalah
Tambahkan tag json:"nome" ke kolom Nama dan tag json:"eta" ke kolom Usia.
Tunjukkan petunjuk
Tag adalah string mentah antara backtick tepat setelah jenis bidang.
Solusi tersedia setelah 3 upaya
Tambahkan opsi omitempty ke bidang Usia: opsi ini harus dihilangkan jika nilainya 0.
Tunjukkan petunjuk
Opsi muncul setelah nama, dipisahkan dengan koma: json:"nome,omitempty".
Solusi tersedia setelah 3 upaya
Apa yang dicetak dengan tag json:"nome" dan json:"eta"?
u := User{Name: "Ada", Age: 36}
b, _ := json.Marshal(u)
fmt.Println(string(b))Rekap
- Tag adalah string mentah di antara backtick:
`key:"value" kunci2:"nilai2"`. json:"nama": 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,validasi,form, …