Доступ к вложенной карте типа map[string]interface{} в Golang
Итак, я пытаюсь разобрать ответ JSON. Он может быть на несколько уровней глубже. Вот что я сделал:
var result map[string]interface{}
json.Unmarshal(apiResponse, &result)
Во-первых, правильно ли это делать?
Предположим, что ответ был следующим:
{
"args": {
"foo": "bar"
}
}
Чтобы получить доступ к ключу foo, я увидел игровую площадку , делающую это:
result["args"].(map[string]interface{})["foo"]
Здесь, что такое .() обозначение? Это правильно?
1 ответ:
Обозначение
x.(T)называется утверждением типа .Для выражения
xтипа интерфейса и типаTпервичное выражениеx.(T)утверждает, чтоxне являетсяnilи что значение, хранящееся вx, имеет типT.Ваш пример:
Это означает, что значение вашей картыresult["args"].(map[string]interface{})["foo"]results, связанной с ключом"args", имеет типmap[string]interface{}(другая карта с ключамиstringи любыми значениями). И вы хотите получить доступ к элементу этого карта, связанная с ключом"foo".Если вы знаете что-то о входном формате JSON, то да, вы должны использовать универсальный тип
map[string]interface{}для его обработки. Если вы знаете точную структуру входного JSON, вы можете создатьstruct, чтобы соответствовать ожидаемым полям, и при этом вы можете разобрать текст JSON в значение вашего пользовательского типаstruct, например:type Point struct { Name string X, Y int } func main() { in := `{"Name":"center","X":2,"Y":3}` pt := Point{} json.Unmarshal([]byte(in), &pt) fmt.Printf("Result: %+v", pt) }Вывод:
Result: {Name:center X:2 Y:3}Попробуйте это наGo Playground .
Моделирование входные данные
Ваш текущий вход JSON можно смоделировать следующим образом:
type Data struct { Args struct { Foo string } }И доступ к
Foo(попробуйте это на Go Playground):d := Data{} json.Unmarshal([]byte(in), &d) fmt.Println("Foo:", d.Args.Foo)
Comments