使用 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中文网其他相关文章!