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

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

Linda Hamilton
发布: 2024-12-26 00:22:09
原创
1000 人浏览过

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

Go JSON 中非 RFC 3339 时间格式的自定义解组

在 Go 中,encoding/json 包严格遵守 RFC 3339,当反序列化时间值。然而,经常会出现数据采用不同时间格式的情况。如果您想避免繁琐的转换,这可能会成为问题。

使用自定义类型

要处理此问题,您可以实现 json.Marshaler 和 json.Unmarshaler 接口在自定义类型上。这允许您定义如何对您的类型进行编组和从 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()
}
登录后复制

In这种类型:

  • UnmarshalJSON 方法从自定义格式解析时间值("2006/01/02|15:04:05")。
  • MarshalJSON 方法以相同的自定义格式输出时间值。
  • IsSet 方法检查时间值是否为设置(非零)。

您可以在 JSON 结构中使用 CustomTime 类型来处理非 RFC 3339 格式的时间值:

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())
}
登录后复制

在此示例中,Args 结构体对 Time 字段使用 CustomTime 类型。当使用非 RFC 3339 时间格式反序列化 JSON 数据时,CustomTime 类型将正确处理转换。

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

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