首页 > 后端开发 > Golang > 如何在 Go 的 JSON 编组/解组中有效处理带有 `time.Time` 字段的 `omitempty`?

如何在 Go 的 JSON 编组/解组中有效处理带有 `time.Time` 字段的 `omitempty`?

Patricia Arquette
发布: 2024-12-26 17:46:10
原创
989 人浏览过

How to Effectively Handle `omitempty` with `time.Time` Fields in Go's JSON Marshaling/Unmarshaling?

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

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