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