Как разобрать тело ответа http в формате json в golang? - PullRequest
0 голосов
/ 17 октября 2019

Я получаю ответное тело. формат тела следующий:

  [
    {
       "id":1,
       "name":"111" 
    },
    {
       "id":2,
       "name":"222" 
    }
  ]

Я хочу разобрать тело в структуру json, мой код такой:

type Info struct {
      Id uint32 `json:id`
      Name string `json:name`
  }

  type Response struct {
      infos []Info
  }

  v := &Response{}
  data, err := ioutil.ReadAll(response.Body)
  if err := json.Unmarshal(data, v); err != nil {
      log.Fatalf("Parse response failed, reason: %v \n", err)
  }

Всегда выдает ошибку: не можетunmarshal массив в значение Go типа xxx, кто-то может помочь?

1 Ответ

1 голос
/ 17 октября 2019

Ваши данные представлены в виде массива, так как начинаются и заканчиваются квадратными скобками:

[{"id":1, "name":"111"}, {"id":2, "name":"222"}]

Итак, вам нужно срез Info, чтобы разобрать его ([]Info).
И обратите внимание, что вы должны добавлять двойные кавычки в теги JSON внутри обратных символов, например json:"id".

Попробуйте этот рабочий пример:

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

func main() {
    var v []Info
    if err := json.Unmarshal(data, &v); err != nil {
        log.Fatalf("Parse response failed, reason: %v \n", err)
    }
    fmt.Println(v)
}

// Info is ID Name
type Info struct {
    ID   uint32 `json:"id"`
    Name string `json:"name"`
}

// Response is a slice of Info
type Response struct {
    infos []Info
}

var data = []byte(`[
    {
       "id":1,
       "name":"111" 
    },
    {
       "id":2,
       "name":"222" 
    }
  ]`)

Вывод:

[{1 111} {2 222}]

А если вам нравится использовать v := &Response{}, то вам нужноиспользовать &v.infos например: json.Unmarshal(data, &v.infos).

См .: Пример: JSON

Документы :

Чтобы демонтировать массив JSON в срез, Unmarshal сбрасывает длину среза до нуля, а затем добавляет каждый элемент к срезу. В качестве особого случая, чтобы демонтировать пустой массив JSON в фрагмент, Unmarshal заменяет фрагмент новым пустым фрагментом.

Чтобы демонтировать массив JSON в массив Go, Unmarshal декодирует элементы массива JSON в соответствующий массив Goэлементы. Если массив Go меньше, чем массив JSON, дополнительные элементы массива JSON отбрасываются. Если массив JSON меньше массива Go, дополнительные элементы массива Go устанавливаются в нулевые значения.

И try пример в пакете doc:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var jsonBlob = []byte(`[
    {"Name": "Platypus", "Order": "Monotremata"},
    {"Name": "Quoll",    "Order": "Dasyuromorphia"}
]`)
    type Animal struct {
        Name  string
        Order string
    }
    var animals []Animal
    err := json.Unmarshal(jsonBlob, &animals)
    if err != nil {
        fmt.Println("error:", err)
    }
    fmt.Printf("%+v", animals)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...