首页 >后端开发 >Golang >如何在 Go 中自定义 JSON 时间解组以处理非 RFC 3339 格式?

如何在 Go 中自定义 JSON 时间解组以处理非 RFC 3339 格式?

Linda Hamilton
Linda Hamilton原创
2024-12-18 21:09:13995浏览

How Can I Customize JSON Time Unmarshaling in Go to Handle Non-RFC 3339 Formats?

在 Go 中自定义 JSON 时间解组

处理包含时间值的 JSON 数据时,Go 中的encoding/json 包可能会受到限制如果时间格式不符合 RFC 3339。虽然可以手动将时间转换为 RFC 3339 格式解析,有一种更有效的方法。

实现 Marshaler/Unmarshaler 接口

要处理自定义时间格式,请创建一个实现 json.Marshaler 和 json 的自定义类型。解组器接口。这允许您定义时间值应如何序列化和反序列化。

这是一个名为 CustomTime 的示例自定义类型:

type CustomTime struct {
    time.Time
}

const ctLayout = "2006/01/02|15:04:05"

func (ct *CustomTime) UnmarshalJSON(b []byte) (err error) {
    s := strings.Trim(string(b), "\"")
    if s == "null" {
        ct.Time = time.Time{}
        return
    }
    ct.Time, err = time.Parse(ctLayout, s)
    return
}

func (ct *CustomTime) MarshalJSON() ([]byte, error) {
    if ct.Time.IsZero() {
        return []byte("null"), nil
    }
    return []byte(fmt.Sprintf("\"%s\"", ct.Time.Format(ctLayout))), nil
}

var nilTime = (time.Time{}).UnixNano()
func (ct *CustomTime) IsSet() bool {
    return !ct.IsZero()
}

在此自定义类型中:

  • UnmarshalJSON 使用指定的自定义将 JSON 字符串转换为 time.Time 值
  • MarshalJSON 使用相同的自定义布局将 time.Time 值转换为 JSON 字符串。
  • IsSet 是一个可选方法,用于检查 CustomTime 值是否已设置(不为零)。

使用

自定义时间后type 定义后,它可以用作结构体字段来反序列化具有自定义时间格式的 JSON 数据。

type Args struct {
    Time CustomTime
}

var data = `
    {
        "Time": "2014/08/01|11:27:18"
    }
`

func main() {
    a := Args{}
    fmt.Println(json.Unmarshal([]byte(data), &a))
    fmt.Println(a.Time.String())
}

此示例成功反序列化 JSON 数据,其中时间字段为自定义“2006/01/” 02|15:04:05" 格式。

以上是如何在 Go 中自定义 JSON 时间解组以处理非 RFC 3339 格式?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn