首页 > 后端开发 > Golang > 如何在 Go 中使用'encoding/json”反序列化非 RFC 3339 时间格式?

如何在 Go 中使用'encoding/json”反序列化非 RFC 3339 时间格式?

Patricia Arquette
发布: 2024-12-18 20:57:10
原创
710 人浏览过

How to Deserialize Non-RFC 3339 Time Formats in Go with `encoding/json`?

在Go中使用encoding/json反序列化非RFC 3339时间格式

在Go中使用encoding/json包时,解组时间值的默认行为是严格遵守 RFC 3339 格式。但是,如果遇到偏离此标准的时间格式怎么办?

自定义时间类型实现

要处理这种情况,您可以在自定义上实现 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()
}
登录后复制

在结构中的使用

要使用 CustomTime 类型,您可以将其作为字段嵌入到struct:

type Args struct {
    Time CustomTime
}
登录后复制

示例

以下是如何使用 Args 结构体和 CustomTime 类型来解组包含非 RFC 3339 时间格式的 JSON 字符串的示例:

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

输出:

<nil>
2014-08-01 11:27:18 +0000 UTC
登录后复制

通过实施自定义CustomTime类型,可以处理非RFC 3339格式的时间格式的反序列化。

以上是如何在 Go 中使用'encoding/json”反序列化非 RFC 3339 时间格式?的详细内容。更多信息请关注PHP中文网其他相关文章!

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