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:
- Jika tipe field memiliki method "IsZero() bool", method itu akan digunakan untuk menentukan apakah nilainya zero.
- 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
- https://tip.golang.org/doc/go1.24
- https://pkg.go.dev/encoding/json@master#Marshal
- https://go.dev/tour/basics/12
Last updated on