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

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

Go 中的 JSON 解析 - 技巧

Go 中的 JSON 解析 - 技巧

Go
長風秋雁 2023-05-08 14:56:25
如何使用 Go 解析這個 json? timelinedata := '{   "2016-08-17T00:00:00.000Z": 4,   "2016-11-02T00:00:00.000Z": 1,   "2017-08-30T00:00:00.000Z": 1   } '我希望通過遍歷 json 將日期和值放在單獨的變量中。目前我正在這樣做var timeline map[string]intjson.Unmarshal([]byte(timelinedata),for k, v := range timeline {            new_key := k            new_val := v            println("val--->>", new_key, new_val)        }問題是輸出的順序不正確,就像 json 輸入一樣。每次我運行循環時,輸出順序都不同。我想按照輸入的確切順序映射 json。我想我沒有以正確的方式映射它---
查看完整描述

1 回答

?
飲歌長嘯

TA貢獻1951條經驗 獲得超3個贊

你不應該假設 JSON 對象中的鍵順序意味著什么:

從RFC 7159 的介紹(強調我的):

對象是零個或多個名稱/值對的無序集合,其中名稱是字符串,值是字符串、數字、布爾值、空值、對象或數組。

數組是零個或多個值的有序序列

除此之外,您不應該假設 JSON 文檔的制作者已經控制了鍵/值順序;地圖在大多數語言中都是無序的,所以它主要歸結為使用的編碼庫。如果生產者確實關心順序,他們會使用數組。

也就是說,如果您真的對 JSON 鍵的順序感興趣,則必須使用json.Decoder.Token逐個解碼對象:

package main


import (

? ? "encoding/json"

? ? "fmt"

? ? "log"

? ? "strings"

)


func main() {

? ? j := `{

? ? ? ? "2016-08-17T00:00:00.000Z": 4,

? ? ? ? "2016-11-02T00:00:00.000Z": 1,

? ? ? ? "2017-08-30T00:00:00.000Z": 1

? ? }`


? ? dec := json.NewDecoder(strings.NewReader(j))

? ? for dec.More() {

? ? ? ? t, err := dec.Token()

? ? ? ? if err != nil {

? ? ? ? ? ? log.Fatal(err)

? ? ? ? }


? ? ? ? switch t := t.(type) {

? ? ? ? case json.Delim:

? ? ? ? ? ? // no-op

? ? ? ? case string:

? ? ? ? ? ? fmt.Printf("%s => ", t)

? ? ? ? case float64:

? ? ? ? ? ? fmt.Printf("%.0f\n", t)

? ? ? ? case json.Number:

? ? ? ? ? ? fmt.Printf(" %s\n", t)

? ? ? ? default:

? ? ? ? ? ? log.Fatalf("Unexpected type: %T", t)

? ? ? ? }

? ? }

}


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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