我正在尝试将一些json解组到结构中并具有以下内容:
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
)
type Added struct {
Added *time.Time `json:"added"`
}
func main() {
st := strings.NewReader(`{"added": ""}`)
a := &Added{}
err := json.NewDecoder(st).Decode(&a)
if err != nil {
panic(err)
}
fmt.Println(a)
}
运行以上结果会导致:
panic: parsing time """" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "2006"
好,所以我尝试一个自定义编组器:
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
)
type Added struct {
Added *MyTime `json:"added"`
}
func main() {
st := strings.NewReader(`{"added": ""}`)
a := &Added{}
err := json.NewDecoder(st).Decode(&a)
if err != nil {
panic(err)
}
fmt.Println(a)
}
type MyTime struct {
*time.Time
}
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
// Fractional seconds are handled implicitly by Parse.
tt, err := time.Parse(`"`+time.RFC3339+`"`, string(data))
*m = MyTime{&tt}
return err
}
然后我得到:
&{%!v(PANIC=runtime error: invalid memory address or nil pointer dereference)}
好的,现在我该怎么办?我只想处理json中的“”值。
找到我的playground和完整的示例。
答案 0 :(得分:1)
导入“时间”
时间表示具有纳秒精度的时间瞬间。
使用时间的程序通常应将其存储并作为值传递, 不是指针。也就是说,时间变量和结构字段应为 键入time.Time,而不是* time.Time。
我一直在解决可能的问题,例如time.Time
,而不是*time.Time
,实际日期等等,直到得到合理的结果为止:
package main
import (
"encoding/json"
"fmt"
"strings"
"time"
)
type MyTime struct {
time.Time
}
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
// Fractional seconds are handled implicitly by Parse.
tt, err := time.Parse(`"`+time.RFC3339+`"`, string(data))
*m = MyTime{tt}
return err
}
type Added struct {
Added MyTime `json:"added"`
}
func main() {
st := strings.NewReader(`{"added": "2012-04-23T18:25:43.511Z"}`)
var a Added
err := json.NewDecoder(st).Decode(&a)
if err != nil {
panic(err)
}
fmt.Println(a)
}
游乐场:https://play.golang.org/p/Uusdp3DkXDU
输出:
{2012-04-23 18:25:43.511 +0000 UTC}
在日期字符串为空(""
的情况下,time.Time
的零值为0001-01-01 00:00:00 +0000 UTC
:
游乐场:https://play.golang.org/p/eQoEyqBlhg2
输出:
{0001-01-01 00:00:00 +0000 UTC}
使用time
IsZero
方法测试零值。
func (t Time) IsZero() bool
IsZero报告t是否代表零时刻,即1月1日, 第1年,世界标准时间00:00:00。
答案 1 :(得分:1)
我认为您使用自定义编组器非常接近解决方案。也许只是恢复正常日期的正常解码。这可能会帮助:
type MyTime time.Time
func (m *MyTime) UnmarshalJSON(data []byte) error {
// Ignore null, like in the main JSON package.
if string(data) == "null" || string(data) == `""` {
return nil
}
return json.Unmarshal(data, (*time.Time)(m))
}