作者:mobiledu2502880273 | 来源:互联网 | 2023-05-19 19:08
所以我正在尝试解析JSON响应.它可以是多层次的.这就是我做的:
var result map[string]interface{}
json.Unmarshal(apiResponse, &result)
首先,这是正确的方法吗?
让我们说回应如下:
{
"args": {
"foo": "bar"
}
}
为了访问密钥foo
,我看到一个游乐场这样做:
result["args"].(map[string]interface{})["foo"]
在这里,.()
符号是什么?它是否正确?
1> icza..:
该表示法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)
@SreejithRamakrishnan是的,`stirng(foo)`和`foo。(string)`之间是有区别的。第一个是_conversion_,第二个是_type assertion_。类型声明只能在_interface types _(“ interface {}”是一个合格的空接口)上使用,有关转换规则,请阅读规范:[Conversions](http://golang.org/ref/spec#Conversions )。如果您遇到这种情况,则不能仅使用转换类型声明。