Ваши данные представлены в виде массива, так как начинаются и заканчиваются квадратными скобками:
[{"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)
}