Извлечь элемент из вложенной строки JSON - PullRequest
0 голосов
/ 25 февраля 2020

Это код Go, который у меня есть:

func main(){

    s := string(`{"Id": "ABC123",
                  "Name": "Hello", 
                  "RelatedItems":[
                         {"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
                         {"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
                  }`)

    var result map[string]interface{}
    json.Unmarshal([]byte(s), &result)
    fmt.Println("Id:", result["Id"])
    Rlist := result["RelatedItems"].([]map[string]interface{})

    for key, pist := range pist {
        fmt.Println("Key: ", key)
        fmt.Println("RID:", pist["RId"])
    }

}

Структура ниже

type Model struct {
    Id   string `json:"Id"`
    Name string `json:"ModelName"`
    RelatedItems []RelatedItems `json:"RelatedItems"`
}

type RelatedItems struct {
    RId       string `json:"PCId"`
    RName     string `json:"PCName"`
    RChildren string `json:"string"`
}

Как получить вывод, который позволил бы мне выбрать конкретный поле сверху? Например:

Выход

Id: ключ ABC123: 0 RID: ключ TEST123: 1 RID: TEST234

Я вижу эту ошибку

pani c: преобразование интерфейса: interface {} - ноль, а не [] map [string] interface {}

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

Зачем вам в любом случае разархивировать карту и go через проверки типов?

type Model struct {
    Id   string `json:"Id"`
    Name string `json:"ModelName"`
    RelatedItems []RelatedItems `json:"RelatedItems"`
}

type RelatedItems struct {
    RId       string `json:"PCId"`
    RName     string `json:"PCName"`
    RChildren string `json:"string"`
}

s := `{"Id": "ABC123",
          "Name": "Hello",
          "RelatedItems":[
                 {"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
                 {"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
    }`
var result Model
if err := json.Unmarshal([]byte(s), &result); err != nil {
  log.Fatal(err.Error())
}

fmt.Println("Id: ", result.Id)
for index, ri := range result.RelatedItems {
    fmt.Printf("Key: %d\n", index)
    fmt.Printf("RID: %s\n", ri.RId)
}
0 голосов
/ 25 февраля 2020

Судя по опубликованному контенту, я понимаю, что у вас возникают проблемы с извлечением данных из вложенной строки JSON.

Я взял ваш фрагмент кода и попытался скомпилировать и воспроизвести проблему , После наблюдения у меня есть несколько предложений, основанных на том, как был написан код.

  1. Когда известно, что тип данных в s похож на тип Model, result мог быть объявлен как type Model. Это приводит к var result Model вместо map[string]interface{}.
  2. Когда данные, которые будут декодироваться из interface{}, неизвестны, использование switch может прийти на помощь без сбоя код. Нечто похожее на:

    switch dataType := result["RelatedItems"].(type){ case interface{}: // Handle interface{} case []map[string]interface{}: // Handle []map[string]interface{} default: fmt.Println("Unexpected-Datatype", dataType) // Handle Accordingly

  3. Когда мы пытаемся Unmarshal, мы обязательно рассмотрим json tags, которые предусмотрены для полей структуры , Если закодированные данные не имеют предоставленных нами тегов, данные не будут соответственно декодированы. Следовательно, результат декодирования данных из s в result приведет к {ABC123 [{ } { }]}, поскольку теги полей Name, RId, RName, RChildren заданы как ModelName, PCId, PCName, string соответственно.

С учетом приведенных выше предложений и уточнения приведенных тегов фрагмент кода будет следующим, что определенно извлечет данные из вложенного JSON структур.

s := string(`{"Id": "ABC123",
              "Name": "Hello",
              "RelatedItems":[
                     {"RId":"TEST123","RName":"TEST1","RChildren":"Ch1"},
                     {"RId":"TEST234","RName":"TEST2","RChildren":"Ch2"}]
              }`)

    var result Model
    json.Unmarshal([]byte(s), &result)
    fmt.Println(result)

type Model struct {
        Id           string         `json:"Id"`
        Name         string         `json:"Name"`
        RelatedItems []RelatedItems `json:"RelatedItems"`
}

type RelatedItems struct {
        RId       string `json:"RId"`
        RName     string `json:"RName"`
        RChildren string `json:"RChildren"`
}

В результате получается: {ABC123 Hello [{TEST123 TEST1 Ch1} {TEST234 TEST2 Ch2}]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...