亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將時間“””解析為“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 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號