将时间“”“解析为”“ 2006-01-02T15:04:05Z07:00”“:无法将”“”解析为“ 2006”

时间:2019-02-10 16:42:33

标签: go

我正在尝试将一些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和完整的示例。

2 个答案:

答案 0 :(得分:1)

  

Package time

     

导入“时间”

     

type Time

     

时间表示具有纳秒精度的时间瞬间。

     

使用时间的程序通常应将其存储并作为值传递,   不是指针。也就是说,时间变量和结构字段应为   键入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 (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))
}