Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengendalikan `omitempty` dengan `time.Time` Go dalam JSON Marshaling?
JSON Pengguguran Medan Masa dengan pengabaian
Dalam usaha untuk menyertakan medan masa secara selektif dalam penyirian JSON, json:",omitempty" tag biasanya digunakan. Walau bagaimanapun, ia mungkin menunjukkan tingkah laku yang tidak dijangka apabila digunakan dengan masa. Medan masa.
Isu teras terletak pada sifat masa. Masa sebagai struktur. Tidak seperti jenis skalar seperti rentetan atau integer, yang mempunyai keadaan "kosong" yang jelas (mis., rentetan kosong), struct mempunyai nilai "sifar" yang mewakili contoh yang dimulakan tetapi kosong. Dalam kes ini, nilai masa sifar. Masa memulakan semua medannya kepada nilai lalainya.
Disebabkan perbezaan ini, json:",omitempty" tidak mengenali masa bernilai sifar. Masa sebagai " kosong" dan akan sentiasa memasukkannya dalam output JSON. Untuk mengatasi had ini, anda boleh menggunakan salah satu daripada pendekatan berikut:
1. Gunakan Jenis Penunjuk:
Dengan menukar medan masa.Masa kepada penuding (*masa.Masa), anda boleh mengambil kesempatan daripada fakta bahawa penunjuk tiada dianggap "kosong" dalam pengendalian JSON. Penyelesaian ini memudahkan kod:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
2. Laksanakan Custom Marshaler dan Unmarshaler:
Jika menggunakan penuding tidak dapat dilaksanakan, anda boleh melaksanakan kaedah JSON Marshaler dan Unmarshaler tersuai untuk struct anda yang memanfaatkan masa.Time.IsZero() untuk memasukkan atau mengecualikan medan secara bersyarat:
// MarshalJSON implements the custom JSON Marshaler for MyStruct. func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { return json.Marshal(struct{ Alias }{ms.Field}) } return json.Marshal(struct{ Alias }{Alias(ms)}) } // UnmarshalJSON implements the custom JSON Unmarshaler for MyStruct. func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct var as Alias if err := json.Unmarshal(b, &as); err != nil { return err } ms.Field = as.Field if !as.Timestamp.IsZero() { ms.Timestamp = &as.Timestamp } return nil }
Perhatikan bahawa melaksanakan kaedah Marshaler dan Unmarshaler tersuai memerlukan pemahaman yang lebih mendalam tentang proses pensirilan dan penyahserikatan JSON yang mendasari.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan `omitempty` dengan `time.Time` Go dalam JSON Marshaling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!