使用omitempty 自訂time.Time 欄位的JSON 編組/解組
在此場景中,將omitempty 與JSON 中的time .Time 欄位一起使用編組/解組操作不像其他資料型別那麼簡單。預設情況下,time.Time 是一個結構體,且 omitempty 不會將其零值視為空。
解決方案 1:使用指標
要解決此問題,請將time.Time 欄位到指標 (*time.Time)。指標有一個 nil 值,JSON 會將其視為空。
type MyStruct struct { Timestamp *time.Time `json:",omitempty"` Date *time.Time `json:",omitempty"` Field string `json:",omitempty"` }
透過此修改,帶有 nil 指標的欄位將在 JSON 輸出中省略。
解決方案 2 :自訂編組器/解組器
或者,實作自訂編組器並用於處理 time.Time 欄位的解組器。在封送拆收器中,使用 Time.IsZero() 方法檢查 time.Time 值是否為空。如果為空,則傳回 null JSON 值。在 Unmarshaler 中,將 null JSON 值轉換為 time.Time 的零值。
範例:
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 }
以上是如何在 Go 的 JSON 編組/解組中有效處理帶有 `time.Time` 欄位的 `omitempty`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!