Pilihan teg yang diabaikan gagal berfungsi dengan masa. Masa kerana ia adalah struct. Ini bermakna nilai "sifar" untuk satu masa. Masa ialah nilai yang sah dengan semua nilai medannya ditetapkan kepada sifar, yang tidak dianggap sebagai "kosong" oleh pengekod json.
Untuk mengatasi cabaran ini, mari kita teroka pendekatan tersuai yang menggunakan penunjuk kepada masa.Masa (*masa.Masa) dan melaksanakan pengekodan dan penyahkodan tersuai.
Dengan bertukar kepada penuding, nilai nil ditafsirkan sebagai "kosong" oleh pengekod JSON:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
Jika anda memilih untuk tidak melakukannya gunakan petunjuk, anda boleh melaksanakan Marshaler dan Unmarshaler tersuai antara muka:
type MyStruct struct { Timestamp time.Time `json:"Timestamp"` Date time.Time `json:"Date"` Field string `json:"Field"` } func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct if ms.Timestamp.IsZero() { ms.Timestamp = time.Time{} } if ms.Date.IsZero() { ms.Date = time.Time{} } return json.Marshal(Alias(ms)) } func (ms *MyStruct) UnmarshalJSON(data []byte) error { type Alias MyStruct aux := &Alias{} if err := json.Unmarshal(data, aux); err != nil { return err } *ms = MyStruct(aux) return nil }
Di sini, kaedah MarshalJSON menetapkan masa bernilai sifar. Kejadian masa kepada nilai sifar Go yang setara, membolehkan pengendalian medan kosong.
penyelesaian berasaskan penunjuk adalah mudah dan berkesan. Walau bagaimanapun, jika menggunakan penunjuk tidak boleh dilaksanakan, pendekatan Marshaler/Unmarshaler tersuai menyediakan cara yang fleksibel untuk mengendalikan masa kosong. Nilai masa.
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan `omitempty` dengan Medan `time.Time` dalam Go JSON Marshaling?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!