Menyesuaikan JSON Marshaling/Unmarshaling untuk masa. Medan Masa dengan omitempty
Dalam senario ini, menggunakan omitempty dengan masa. Medan masa dalam JSON operasi marshaling/unmarshaling tidak semudah dengan jenis data lain. Secara lalai, time.Time ialah struct, dan omitempty tidak menganggap nilai sifarnya sebagai kosong.
Penyelesaian 1: Menggunakan Penunjuk
Untuk menyelesaikannya, tukar masa.Medan masa kepada penunjuk (*masa.Masa). Penunjuk mempunyai nilai nil, yang dianggap sebagai kosong oleh JSON.
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
Dengan pengubahsuaian ini, medan dengan penunjuk nil akan ditinggalkan dalam output JSON.
Penyelesaian 2 : Marshaler/Unmarshaler Tersuai
Sebagai alternatif, laksanakan Marshaler tersuai dan Unmarshaler untuk mengendalikan masa. Medan masa. Dalam Marshaler, semak sama ada nilai masa. Masa kosong menggunakan kaedah Time.IsZero(). Jika kosong, kembalikan nilai JSON nol. Dalam Unmarshaler, tukar nilai JSON nol kepada nilai masa sifar. Masa.
Contoh:
type MyStruct struct { Timestamp time.Time `json:",omitempty"` Date time.Time `json:",omitempty"` Field string `json:",omitempty"` } func (ms MyStruct) MarshalJSON() ([]byte, error) { type Alias MyStruct var null NullTime if ms.Timestamp.IsZero() { null = NullTime(ms.Timestamp) } return json.Marshal(&struct { Alias Timestamp NullTime `json:"Timestamp"` }{ Alias: Alias(ms), Timestamp: null, }) } func (ms *MyStruct) UnmarshalJSON(b []byte) error { type Alias MyStruct aux := &struct { *Alias Timestamp NullTime `json:"Timestamp"` }{ Alias: (*Alias)(ms), } if err := json.Unmarshal(b, &aux); err != nil { return err } ms.Timestamp = time.Time(aux.Timestamp) return nil } // NullTime represents a time.Time that can be null type NullTime time.Time func (t NullTime) MarshalJSON() ([]byte, error) { if t.IsZero() { return []byte("null"), nil } return []byte(fmt.Sprintf("\"%s\"", time.Time(t).Format(time.RFC3339))), nil } func (t *NullTime) UnmarshalJSON(b []byte) error { str := string(b) if str == "null" { *t = NullTime{} return nil } ts, err := time.Parse(time.RFC3339, str[1:len(str)-1]) if err != nil { return err } *t = NullTime(ts) return nil }
Atas ialah kandungan terperinci Bagaimana Mengendalikan `omitempty` dengan Medan `time.Time` dengan Berkesan dalam JSON Marshaling/Unmarshaling Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!