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() }
在这个定制的时间里类型:
用法
现在,您可以在 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中文网其他相关文章!