使用golang中的数组解析JSON

时间:2018-10-15 08:04:46

标签: json parsing go

我想检索所有ID以及索引值。

{
  "results": [
    {
      "ID": "3b72"
    },
    {
      "ID": "d953b1"
    },
    {
      "ID": "8eac"
    },
    {
      "ID": "00b4c"
    },
    {
      "ID": "22360"
    }
  ],
  "index": 10
}

我尝试了以下操作,但没有成功(我在golang中是一个新手):

var result map[string]interface{}
json.Unmarshal([]byte(body), &result)

ids:= result["results"].(map[string]interface{})

for key, value := range ids{
    fmt.Println(key, value.(string))
}

2 个答案:

答案 0 :(得分:4)

根据您的json字符串,需要解决的问题很少。首先,result["results"]属性必须强制转换为[]interface{},因为results保存数组数据。

ids := result["results"].([]interface{})

然后,在ids的每次迭代中,需要将变量value(类型为interface{})强制转换为map[string]interface{},这样我们才能访问{ {1}}属性来获取其价值。

ID

工作示例:https://play.golang.org/p/Pxq6u7q-NAK


按照@Andrejs的答案,如果您的JSON结构是固定的,那么在结果上使用定义良好的结构会更好(请参阅@danopz的答案)。 It has better performance并花费更少的精力与孩子互动。

答案 1 :(得分:1)

您可能应该为身体定义一个结构,并对其进行编组:

var result struct {
    Results []struct{
        ID string `json:"ID"`
    } `json:"results"`
    Index int `json:"index"`
}

err := json.Unmarshal(body, &result)

if err != nil {
    // do something, result may be empty
    return
}

for i, result := range result.Results {
    fmt.Println(i, result.ID)
}

然后,您将可以访问值,例如通过调用result.Indexresult.Results[0].ID

工作示例:https://play.golang.org/p/j1WpEolQlXV