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

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

DDD
发布: 2024-12-30 22:02:11
原创
520 人浏览过

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

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

Go 中的encoding/json 包严格遵守 RFC 3339 时间格式,当反序列化 JSON 数据。在处理偏离此标准的时间格式时,这可能会很不方便。

解决方案:实现自定义编组器和解组器

而不是修改现有的 JSON 数据或依赖中间转换步骤,更合适的解决方案是在自定义上实现 json.Marshaler 和 json.Unmarshaler 接口

以下示例演示如何创建处理特定非 RFC 3339 时间格式的反序列化的自定义类型 (CustomTime):

import (
    "fmt"
    "strconv"
    "strings"
    "time"

    "github.com/golang/protobuf/ptypes/timestamp"
)

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()
}

type Args struct {
    Time CustomTime
}

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

func main() {
    a := Args{}
    if err := json.Unmarshal([]byte(data), &a); err != nil {
        fmt.Println("Error unmarshaling: ", err)
        return
    }

    if !a.Time.IsSet() {
        fmt.Println("Time not set")
    } else {
        fmt.Println(a.Time.String())
    }
}
登录后复制

注意: CustomTime.IsSet() 方法检查时间字段是否不为零,提供了一种方法来确定时间值是否已实际设置或不是。

通过实现自定义编组器和解组器,您可以灵活地处理可能偏离 RFC 3339 标准的时间格式,从而在 Go 中实现无缝的 JSON 数据反序列化。

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

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