我使用 JSON 将一些值从外部源获取到变量中。
我有这样的类型json.Unmarshal https://golang.org/pkg/json#Unmarshal将值放入:
type Frame struct {
Type string
Value map[string]interface{}
}
var data Frame
解组后,我可以通过以下方式访问类型:data.Type
但如果我尝试做类似的事情:
if data.Type == "image" {
fmt.Printf("%s\n", data.Value.Imagedata)
}
编译器抱怨没有这样的值data.Value.Imagedata
.
所以我的问题是,如何在 Go 中引用我知道根据某些条件将存在的属性?
这样做有效:
type Image struct {
Filename string
}
type Frame struct {
Type string
Value map[string]interface{}
}
但这不是很灵活,因为我会收到不同的Value
s.
json.Unmarshal
将尽力将数据放置在最适合您的类型的位置。从技术上讲,您的第一个示例可以工作,但您正在尝试访问Value
带有点符号的字段,即使您将其声明为地图:
这应该会给你某种形式的输出:
if data.Type == 'image'{
fmt.Printf("%v\n", data.Value["Imagedata"])
}
…考虑到“Imagedata”是 JSON 中的关键。
您可以选择按照您想要或期望的结构深度定义类型,或者使用interface{}
然后对值进行类型断言。随着Value
字段是地图,您总是可以访问像这样的键Value[key]
,该映射条目的值为interface{}
你可以像这样输入断言Value[key].(float64)
.
至于更明确的结构,我发现您可以将对象分解为它们自己的类型,或者将其定义为嵌套在一个位置:
嵌套(带有匿名结构)
type Frame struct {
Type string
Value struct {
Imagedata string `json:"image_data"`
}
}
单独的结构
type Frame struct {
Type string
Value value
}
type value struct {
Imagedata string `json:"image_data"`
}
我自己还在学习 Go,所以这就是我目前的理解程度:-)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)