簡體   English   中英

Golang:將 json 對象解組為一個切片

[英]Golang: unmarshal json object into a slice

我有 JSON 之類的

{
  "a": {"key": "a", "value": 1,},
  "b": {"key": "b", "value": 1,},
}

有沒有辦法將它解組為[]*struct {Key string; Value int} []*struct {Key string; Value int} ,保留結構的順序?

如果我將 JSON 解組為map[string]*struct {Key string; Value int} map[string]*struct {Key string; Value int}然后將地圖轉換為切片,我將失去結構的順序。

要保留順序,請使用Decoder.TokenDecoder.More遍歷頂級 JSON 對象。

r := strings.NewReader(`
 {
   "a": {"key": "a", "value": 1},
   "b": {"key": "b", "value": 1}
 }`)

d := json.NewDecoder(r)
t, err := d.Token()
if err != nil || t != json.Delim('{') {
    log.Fatal("expected object")
}
var result []*element
for d.More() {
    k, err := d.Token()
    if err != nil {
        log.Fatal(err)
    }
    var v element
    if err := d.Decode(&v); err != nil {
        log.Fatal(err)
    }
    result = append(result, &v)
    fmt.Println("key:", k, "value:", v)
}

在 Go Playground 上運行它

將對 log.Fatal 的調用更改為適合您的應用程序的錯誤處理。

此答案編輯問題中的 JSON 以使 JSON 有效。

必須導出結構元素類型中的字段名稱。

我發現的最簡單的方法是使用jsonparser.ObjectEach

import "github.com/buger/jsonparser"

...

var ss []*struct{Key string; Value int}
err = jsonparser.ObjectEach(data, func(key []byte, value []byte, dataType jsonparser.ValueType, offset int) error {
    var s struct{Key string; Value int}
    if err := json.Unmarshal(value, &s); err != nil {
        return err
    }
    *ss = append(*ss, &s)
    return nil
})

您可以使用 map[string]interface{} 解組 json 字符串。 代碼是這樣的

func test() {
    jsonStr := `
 {
   "a": {"key": "a", "value": 1},
   "b": {"key": "b", "value": 1}
 }`
    var mapResult map[string]interface{}
    err := json.Unmarshal([]byte(jsonStr), &mapResult)
    if err != nil {
        fmt.Println("JsonToMapDemo err: ", err)
    }
    fmt.Println(mapResult)
}

輸出為:map[a:map[key:a value:1] b:map[key:b value:1]]

暫無
暫無

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

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