golang, статическая типизация и json
У меня есть json ответ от сервера в виде строки. Я его раскладываю через json.Unmarshal в переменную body с типом map[string]interface{}.
var body map[string]interface{}
if err := json.Unmarshal(bodyByte, &body); err != nil {
log.Fatal(err)
}
Теперь мне надо достать из body["items"] первый элемент, но тут возникает проблема:
Invalid operation: 'body["items"][0]' (type 'interface{}' does not support indexing)
На go я пишу не много (в основном python), так что у меня появился вопрос: Как объяснить go, что в body есть элементы с разными типами (map[string]string, []string, string и т.д)
Ответы (1 шт):
Если у вас заранее известна структура ответа, то вы можете сделать статический тип Go. Тогда Unmarshal будет сам конвертировать типы из json в go.
type Response struct {
Code int `json:"code"`
Items []string `json:"items"`
}
Пример декодирования:
data := []byte(`{"code":200,"items":["Alice","Bob", "Charlie"]}`)
var rsp Response
err := json.Decode(data, &rsp)
if err != nil { panic(err) }
fmt.Println(rsp.Items[0])
О том, как encoding/json интепретирует тег json:"..." см. документацию https://pkg.go.dev/encoding/json#Marshal