JSON data
Ubah struct menjadi JSON dan sebaliknya.
Pahami konsepnya
encoding/json menghubungkan dunia struct Go dengan format JSON. Marshal(v) mengubah nilai menjadi []byte JSON; Unmarshal(data, &v) mengisi struct dari JSON. Kunci-kuncinya diambil dari nama field — kecuali diubah lewat struct tag `json:"nama_lain"`.
Tag mengatur lebih dari nama: `json:"nama,omitempty"` menghapus field saat kosong, `json:"-"` menyembunyikannya total. MarshalIndent menambah indentasi untuk hasil yang enak dibaca manusia. Aturan penting: hanya FIELD DIEKSPOR (huruf awal kapital) yang diserialisasi — json membacanya lewat refleksi dari luar paket.
Unmarshal mengisi struct yang kamu sediakan alamatnya (&s). Field JSON yang tak dikenal diabaikan diam-diam; field struct tanpa pasangan dibiarkan bernilai nol. Untuk aliran data besar, json.NewDecoder(r).Decode(&v) membaca langsung dari io.Reader seperti body permintaan HTTP.
Coba contoh kode
package main
import (
"encoding/json"
"fmt"
)
type Siswa struct {
Nama string `json:"nama"`
Poin int `json:"poin"`
Email string `json:"email,omitempty"`
}
func main() {
ari := Siswa{Nama: "Ari", Poin: 95}
data, _ := json.Marshal(ari)
fmt.Println(string(data)) // {"nama":"Ari","poin":95}
var budi Siswa
json.Unmarshal([]byte(`{"nama":"Budi","poin":80}`), &budi)
fmt.Printf("%+v\n", budi)
}Tag json:"nama" mengganti Nama menjadi nama kecil di keluaran. Email kosong hilang berkat omitempty — ari tidak punya email sehingga fieldnya tidak muncul. Unifikasi balik: Unmarshal mengisi struct budi dari teks JSON mentah; field tanpa pasangan tetap nol.
JSON bersarang dan array
type Kelas struct {
Nama string `json:"nama"`
Anggota []Siswa `json:"anggota"`
}
func main() {
teks := `{"nama":"11A","anggota":[{"nama":"Ari","poin":95},{"nama":"Budi","poin":80}]}`
var k Kelas
json.Unmarshal([]byte(teks), &k)
fmt.Println(k.Nama, len(k.Anggota), k.Anggota[0].Nama)
}Struct bersarang dan slice dipetakan otomatis ke objek dan array JSON — bentuk data selama seumur hidupmu sudah dicover. Slice bertipe struct (Anggota []Siswa) menerima array objek apa pun panjangnya.
Latihan singkat
Uji: tambahkan tag `json:"diskon,omitempty"` agar field kosong hilang — program harus mencetak persis `{"nama":"Kopi","harga":18000}`.