Разбор JSON с массивом в Голанге - PullRequest
0 голосов
/ 15 октября 2018

Я хотел бы получить все идентификаторы, а также значение индекса.

{
  "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 голосов
/ 15 октября 2018

В соответствии с вашей строкой JSON, некоторые вещи должны быть исправлены.Во-первых, свойство result["results"] необходимо преобразовать в []interface{}, поскольку results содержит данные массива.

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

Затем на каждой итерации ids переменная value (тип которойis interface{}) необходимо привести к map[string]interface{}, поэтому мы сможем получить доступ к свойству ID, чтобы получить его значение.

for index, value := range ids {
    valueMap := value.(map[string]interface{})
    fmt.Println(index, valueMap["ID"])
}

Рабочий пример: https://play.golang.org/p/Pxq6u7q-NAK


Согласно ответу @Andrejs, если ваша структура JSON фиксирована, то было бы лучше использовать четко определенную структуру для результата (см. Ответ @ danopz). имеет лучшую производительность и потребляет меньше усилий при взаимодействии со своим ребенком.

0 голосов
/ 15 октября 2018

Вы, вероятно, должны определить структуру для тела и разобрать следующее:

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.Index или result.Results[0].ID.

* 1007.* Рабочий пример: https://play.golang.org/p/j1WpEolQlXV
...