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

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

Patricia Arquette
发布: 2025-01-01 09:28:11
原创
876 人浏览过

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

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

Go 中的encoding/json 包的默认行为是编组和以 RFC 3339 格式解组时间值。但是,如果遇到时间值格式不同的 JSON 数据怎么办?

手动转换的解决方案

一种方法是将时间值反序列化为字符串,手动将其转换为RFC 3339格式,然后再次应用json.Unmarshal。虽然此方法有效,但它引入了额外的处理开销和混乱的代码。

自定义时间类型

更优雅的解决方案是实现 json.Marshaler 和 json.Unmarshaler自定义时间类型的接口。这允许对时间值序列化和反序列化进行自定义处理。

示例实现

以下是名为 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 处理将非 RFC 3339 时间格式反序列化为 CustomTime 类型。
  • MarshalJSON 处理将 CustomTime 值序列化为自定义格式。
  • IsSet提供了一种方法来检查 CustomTime 是否实际已

用法

现在,您可以在 JSON 反序列化代码中使用 CustomTime 类型:

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 数据中的非 RFC 3339 时间格式,而不会影响灵活性。它还展示了实现自定义 json.Marshaler 和 json.Unmarshaler 接口来处理数据类型序列化和反序列化的强大功能。

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

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