在 Golang 中访问 map[string]interface{} 类型的嵌套映射
文章导读: 问题内容所以我正在尝试解析 JSON 响应。它可以是多个级别的深度。这就是我所做的:var result map[string]interface{}json.Unmarshal(apiResponse, &result)首先,这是。
问题内容
所以我正在尝试解析 JSON 响应。它可以是多个级别的深度。这就是我所做的:
var result map[string]interface{}
json.Unmarshal(apiResponse, &result)
首先,这是正确的做法吗?
可以说响应如下:
{
"args": {
"foo": "bar"
}
}
要访问 key foo
,我看到一个操场这样做:
result["args"].(map[string]interface{})["foo"]
在这里,.()
符号是什么?它是否正确?
正确答案
该符号x.(T)
称为类型断言。
对于
x
接口类型和类型T
的表达式,主表达式x.(T)
断言x
不是nil
,并且存储的值x
是类型T
。
你的例子:
result["args"].(map[string]interface{})["foo"]
这意味着results
与键关联的映射的值"args"
是类型map[string]interface{}
(另一个具有string
键和任何值的映射)。并且您想访问与
key 关联的该映射的元素"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
}
}
并访问(在Go PlaygroundFoo
上尝试)
:
d := Data{}
json.Unmarshal([]byte(in), &d)
fmt.Println("Foo:", d.Args.Foo)