Lompati ke konten utama
Modul 5 · Pelajaran 4 dari 524/50 dalam kursus~12 min
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

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

Konvensi format: key:"value" dipisahkan dengan spasi (BUKAN koma) untuk beberapa kunci:

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

tag json: opsi

Opsi paling umum adalah json, digunakan oleh encoding/json:

TandaiEfek
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
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 dihilangkan (nilai nol 0 + omitempty); Password adalah dikecualikan seluruhnya.

Marsekal dan Unmarshal

Go
// 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/xml
  • yaml:"..." — yaml.v3
  • db:"..." — sqlx / halx
  • validate:"..." — buka taman bermain/validator
  • form:"..." — pengikatan gin / gema

Perpustakaan membacanya melalui refleksi (reflect.StructTag.Get("json")): itu hanyalah string sampai seseorang menafsirkannya.

Cobalah

Latihan#go.m5.l4.e1
Upaya: 0Memuat…

Tambahkan tag json:"nome" ke kolom Nama dan tag json:"eta" ke kolom Usia.

Memuat editor…
Tunjukkan petunjuk

Tag adalah string mentah antara backtick tepat setelah jenis bidang.

Solusi tersedia setelah 3 upaya

Latihan#go.m5.l4.e2
Upaya: 0Memuat…

Tambahkan opsi omitempty ke bidang Usia: opsi ini harus dihilangkan jika nilainya 0.

Memuat editor…
Tunjukkan petunjuk

Opsi muncul setelah nama, dipisahkan dengan koma: json:"nome,omitempty".

Solusi tersedia setelah 3 upaya

Quiz#go.m5.l4.e3
Siap

Apa yang dicetak dengan tag json:"nome" dan json:"eta"?

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

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