假设我有下面的json
{
name: "John",
birth_date: "1996-10-07"
}
我想把它解码成下面的结构
type Person struct {
Name string `json:"name"`
BirthDate time.Time `json:"birth_date"`
}
像这样
person := Person{}
decoder := json.NewDecoder(req.Body);
if err := decoder.Decode(&person); err != nil {
log.Println(err)
}
得到的误差是parsing time ""1996-10-07"" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "T"
如果我手动解析它,我会这样做
t, err := time.Parse("2006-01-02", "1996-10-07")
但是当时间值来自JSON字符串时我如何让解码器以上面的格式解析它?
4条答案
按热度按时间zi8p0yeb1#
这就是需要实现自定义编组和解组函数的情况。
按照json包的Golang文档中的示例操作,您会得到如下内容:
fkaflof62#
如果有很多struct,而你只是实现自定义的marshal和unmarshal函数,那么你需要做很多工作,你可以使用另一个库来代替,比如json-iterator扩展jsontime:
au9on6nz3#
我在https://github.com/a-h/date编写了一个用于处理
yyyy-MM-dd
和yyyy-MM-ddThh:mm:ss
日期的包它使用上面答案中的类型别名方法,然后通过一些修改实现
MarshalJSON
和UnmarshalJSON
函数。在正确的时区中进行解析是很重要的。我的代码假定使用UTC,但是出于某种原因,您可能希望使用计算机的时区。
我还发现,使用
time.Parse
函数的解决方案将Go语言的内部机制泄露为一条错误消息,而客户并不认为这有什么帮助,例如:cannot parse "sdfdf-01-01" as "2006"
。只有当您知道服务器是用Go语言编写的,并且2006
是示例日期格式时,这才有用,因此我添加了更可读的错误消息。我还实现了
Stringer
接口,以便它在日志或调试消息中得到漂亮的打印。omhiaaxx4#
封送、反封送和字符串方法的自定义实现。
以及对他们的测试。