首页 > 后端开发 > Golang > 如何在 Go JSON 封送处理中处理带有 `time.Time` 字段的 `omitempty`?

如何在 Go JSON 封送处理中处理带有 `time.Time` 字段的 `omitempty`?

Susan Sarandon
发布: 2024-12-22 10:55:11
原创
368 人浏览过

How to Handle `omitempty` with `time.Time` Fields in Go JSON Marshaling?

带有 time.Time 字段的 JSON omitempty:自定义解决方案

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板