我正在使用json从外部源获取一些结构的值。使用UnMarshal将值放在结构中。
我有一个像这样的结构,UnMarshal将值放入:
type Frame struct{
Type string
Value map[string]interface{}
}
var data Frame
在UnMarshal之后,我可以通过以下方式访问类型:data.Type
但如果我尝试做类似的事情:
if data.Type == 'image'{
fmt.Println(fmt.Sprintf("%s", data.Value.Imagedata))
}
编译器抱怨没有这样的值data.Value.Imagedata
所以我的问题是,如何根据某些条件在我知道的代码中引用GoLang中的属性?
这样做有效:
type Image struct{
Filename string
}
type Frame struct{
Type string
Value map[string]interface{}
}
但这不是很灵活,因为我会收到不同的Value
s
答案 0 :(得分:15)
UnMarshal将尽最大努力将数据放在最适合您的结构的位置。从技术上讲,您的第一个示例将起作用,但您尝试使用点表示法访问Value
字段,即使您将其声明为地图:
这应该给你一些形式的输出:
if data.Type == 'image'{
fmt.Printf("%v\n", data.Value["Imagedata"])
}
......考虑到“Imagedata”是json的关键。
您可以选择根据需要深入定义结构,或者期望结构,或者使用接口{},然后对值进行类型断言。如果Value字段是地图,您将始终访问Value[key]
之类的键,然后该地图的值是一个接口{},您可以键入断言,如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"`
}
我还在学习自己,所以这是我目前理解的程度: - )