omitempty 標籤選項無法與 time.Time 一起使用,因為它是一個結構體。這意味著時間的“零”值。 Time 是一個有效值,其所有欄位值都設為零,json 編碼器不會將其視為「空」。
要克服這項挑戰,讓我們探索一種自訂方法,該方法使用指向 time.Time (*time.Time) 的指標並實作自訂編碼和解碼。
切換到指針,nil 值會被JSON 編碼器解釋為「空」:
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
如果您不想這樣做使用指針,可以實現自訂的Marshaler 和Unmarshaler介面:
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 }
這裡, MarshalJSON 方法將零值 time.Time 實例設定為等效的 Go 零值,從而啟用空白欄位處理。
基於指標的解決方案簡單有效。但是,如果使用指標不可行,則自訂 Marshaler/Unmarshaler 方法提供了一種靈活的方法來處理空 time.Time 值。
以上是如何在 Go JSON 封送處理中處理帶有 `time.Time` 欄位的 `omitempty`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!