为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
冉冉说 2023-06-05 17:53:26
我正在尝试将一些 json 解组为一个结构并具有以下内容:package mainimport (    "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 mainimport (    "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 的“”值。找到了带有完整示例的我的游乐场。
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

包车时间

导入“时间”

类型时间

A 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(时间)IsZero

func (t Time) IsZero() bool

IsZero 报告 t 是否代表零时刻,1 月 1 日,1 年,00:00:00 UTC。


查看完整回答
反对 回复 2023-06-05
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

我认为您已经非常接近您的自定义编组器的解决方案。也许只是恢复正常日期的正常解码。这可能有助于:


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

}


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信