我正在使用JSON将一些值从外部源获取到变量中。
我有一个这样的类型,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
的。
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)
。
至于做更明确的结构,我发现您可以将对象分解为自己的类型,也可以将其嵌套在一个位置:
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自己,所以这是我目前的理解程度:-)。
问题内容: 我有一个用swift编写的CustomViewController类和用Objective C编写的CustomNavigationController类。我试图将CustomNavigationController作为属性添加到我的CustomViewController中。我已经添加到我的桥接头中。 在我的CustomViewController中,我有: 在尝试构建并运行之前没有
问题内容: 我的错误输出: 无效的配置对象。已使用与API模式不匹配的配置对象初始化Webpack。-configuration.module具有未知的属性“ loaders”。这些属性是有效的:对象{exprContextCritical?,exprContextRecursive?,exprContextRegExp?,exprContextRequest?,noParse ?、规则?,def
我已经在stackoverflow和网络上寻找解决方案。我没有见过有效的解决方案,因为可能没有一个帖子完全符合我的用例,它包含文件中的列表和对象结构。 这里有一个例子作为yaml 这是与属性文件相同的示例 我希望能够向我的应用程序提供 teddy.yml 或 teddy.properties 文件以进行配置。 这是我的课程: 我已经尝试了这种设置,使用环境来尝试访问属性,删除前缀,声明一个“Pro
我有这门课: ContractDetail类如下所示:
问题内容: 这是一个不起作用的简单go程序: 错误: prog.go:18:无效的操作:v [属性](*顶点类型的索引) 我想要的是使用名称访问Vertex X属性。如果我这样做,它会起作用,但不会。 有人可以告诉我如何进行这项工作吗? 问题答案: 大多数代码都不需要这种动态查找。与直接访问相比,它效率低下(编译器知道Vertex结构中X字段的偏移量,可以将vX编译为单个机器指令,而动态查找则需要