Portal/Notes πŸ“
Golang

JSON: omitzero

Memahami tag omitzero di Go 1.24 β€” solusi untuk masalah zero value pada serialisasi JSON.

Versi Bahasa Indonesia. Baca dalam Bahasa Inggris

Di Go versi 1.24 yang akan dirilis sekitar Februari 2025, ada fitur yang sangat berguna menurut saya. Yaitu opsi tag json baru omitzero.

Opsi "omitzero" menentukan bahwa field harus dihilangkan dari encoding jika field memiliki zero value, sesuai aturan:

  1. Jika tipe field memiliki method "IsZero() bool", method itu akan digunakan untuk menentukan apakah nilainya zero.
  2. Jika tidak, nilai dianggap zero jika merupakan zero value untuk tipenya.

Dari dokumentasi resmi Go, field yang memiliki tag omitzero dan memiliki zero value baik melalui method IsZero() atau zero value untuk tipenya akan dikecualikan.

Mari kita lihat contoh:

func main() {
    type Address struct {
        City    string `json:"city"`
        Country string `json:"country"`
    }

    type Payload struct {
        Name        string    `json:"name,omitempty"`
        Age         int       `json:"age,omitempty"`
        DateOfBirth time.Time `json:"date_of_birth,omitempty"`
        Address     Address   `json:"address,omitempty"`
        Empty       struct{}  `json:"empty,omitempty"`
    }

    res, err := json.MarshalIndent(Payload{}, "", "    ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(res))
}

Output:

{
    "date_of_birth": "0001-01-01T00:00:00Z",
    "address": {
        "city": "",
        "country": ""
    },
    "empty": {}
}

Masalah dengan tag omitempty adalah ia hanya mengecualikan nilai yang kosong seperti false, 0, pointer nil, interface nil, dan array, slice, map, atau string yang memiliki panjang nol. Jadi jika Anda memiliki field struct yang memiliki nilai kosong (seperti struct kosong), itu tetap disertakan meskipun field tersebut memiliki tag omitempty, kecuali kita mendefinisikan field sebagai pointer dan membuatnya nil.

Kasus yang sama terjadi pada time.Time di mana zero value-nya adalah "0001-01-01T00:00:00Z". Dengan omitempty tetap disertakan meskipun itu zero value.

Tag omitzero akan menyelesaikan masalah ini di Go 1.24. Kita dapat menggunakan Go playground dengan versi dev branch untuk mencobanya:

func main() {
    type Address struct {
        City    string `json:"city"`
        Country string `json:"country"`
    }

    type Payload struct {
        Name        string    `json:"name,omitzero"`
        Age         int       `json:"age,omitzero"`
        DateOfBirth time.Time `json:"date_of_birth,omitzero"`
        Address     Address   `json:"address,omitzero"`
        Empty       struct{}  `json:"empty,omitzero"`
    }

    res, err := json.MarshalIndent(Payload{}, "", "  ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(res))
}

Output:

{}

Golang Playground: https://go.dev/play/p/jzBYfFFY9Yp?v=gotip

Referensi


Edit on GitHub

Last updated on

JSON: omitzero | Faisal Affan