← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 48

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}`.