我正在使用JSON将一些值从外部源获取到变量中。
我有一个这样的类型,json.Unmarshal将值放入:
json.Unmarshal
type Frame struct { Type string Value map[string]interface{} } var data Frame
解组后,我可以通过以下方式访问类型: data.Type
data.Type
但是如果我尝试做类似的事情:
if data.Type == "image" { fmt.Printf("%s\n", data.Value.Imagedata) }
编译器抱怨没有这样的值data.Value.Imagedata。
data.Value.Imagedata
所以我的问题是,我如何根据某些条件引用我知道会存在的Go属性?
做到这一点:
type Image struct { Filename string } type Frame struct { Type string Value map[string]interface{} }
但这不是很灵活,因为我将收到不同Value的。
Value
json.Unmarshal会尽力将数据放置在最适合您的类型的位置。从技术上讲,您的第一个示例将起作用,但是Value即使您声明它是地图,您仍尝试使用点符号访问该字段:
这应该给您某种形式的输出:
if data.Type == 'image'{ fmt.Printf("%v\n", data.Value["Imagedata"]) }
…考虑到“ Imagedata”是JSON中的关键。
您可以选择根据需要或期望的结构深度定义类型,或者使用an interface{}然后对值进行类型声明。如果该Value字段是一个映射,则您将始终访问键,如Value[key],而该映射项的值就是interface{}您可以键入assert的值Value[key].(float64)。
interface{}
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"` }
我仍然在学习Go自己,所以这是我目前的理解程度:-)。