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)
? ? ? ? }
? ? }
}
- 1 回答
- 0 關注
- 140 瀏覽
添加回答
舉報