簡體   English   中英

Golang 使用 json unmarshall 獲取日期時間值

[英]Golang get datetime value with json unmarshall

在我的代碼中,一個方法監聽 redis 隊列。 我將 Redis 發送的數據作為以下代碼示例的“有效負載”變量。 “currenttime”變量是一個time.time,但json.unmarshall 將其更改為字符串值。 我怎樣才能防止這種情況發生? 我想從當前時間獲取 time.time 數據。 “值”數據也動態變化。 “計數”、“名稱”和“當前時間”變量名稱每次都可以更改。 我可以只看值。

type Event struct {
    ID    string      `json:"id"`
    Value interface{} `json:"value"`
}

func main() {

    payload := "{\"id\":\"61e310f79b9a4db146a8cb7d\",\"value\":{\"Value\":{\"count\":55,\"currenttime\":\"2022-02-23T00:00:00Z\",\"name\":\"numberone\"}}}"
    var event Event
    if err := json.Unmarshal([]byte(payload), &event); err != nil {
        fmt.Println(err)
    }
    fmt.Println(event)
}

如果Event.Value.Value具有預定義的結構

將正確的結構用於 model 您的輸入 JSON,您可以在其中使用time.Time作為當前時間currenttime屬性:

type Event struct {
    ID    string `json:"id"`
    Value struct {
        Value struct {
            Count       int       `json:"count"`
            CurrentTime time.Time `json:"currenttime"`
            Name        string    `json:"name"`
        } `json:"Value"`
    } `json:"value"`
}

像這樣打印:

fmt.Println(event)
fmt.Printf("%+v\n", event)
fmt.Printf("%T %v\n", event.Value.Value.CurrentTime, event.Value.Value.CurrentTime)

Output 是(在Go 游樂場上試試):

{61e310f79b9a4db146a8cb7d {{55 2022-02-23 00:00:00 +0000 UTC numberone}}}
{ID:61e310f79b9a4db146a8cb7d Value:{Value:{Count:55 CurrentTime:2022-02-23 00:00:00 +0000 UTC Name:numberone}}}
time.Time 2022-02-23 00:00:00 +0000 UTC

如果Event.Value.Value沒有預定義的結構

如果Event.Value.Value的屬性可以動態更改,請使用 map ( map[string]interface{} ) 解組。 由於這次我們不能告訴我們需要一個time.Time值(其他屬性不保存時間值),時間字段將被解組為一個string 因此,您必須遍歷其值並嘗試使用正確的布局來解析這些值。 如果成功地解析它,我們就得到了我們想要的。

它看起來像這樣:

type Event struct {
    ID    string `json:"id"`
    Value struct {
        Value map[string]interface{} `json:"Value"`
    } `json:"value"`
}

func main() {

    payload := "{\"id\":\"61e310f79b9a4db146a8cb7d\",\"value\":{\"Value\":{\"foo\":55,\"mytime\":\"2022-02-23T00:00:00Z\",\"bar\":\"numberone\"}}}"
    var event Event
    if err := json.Unmarshal([]byte(payload), &event); err != nil {
        fmt.Println(err)
    }

    for _, v := range event.Value.Value {
        if s, ok := v.(string); ok {
            t, err := time.Parse("2006-01-02T15:04:05Z", s)
            if err == nil {
                fmt.Println("Found time:", t)
            }
        }
    }
}

這將是 output(在Go 游樂場上試試):

Found time: 2022-02-23 00:00:00 +0000 UTC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM