我正在尝试使用结构类型解码json响应。我正在尝试解码的对象的实例如下所示:
{
"title": "Some Title",
"views": 344,
"profiles": {
"customField": "somevalue",
"customField2:" :somevalue"
}
}
golang结构如下:
type Topic struct {
Title string `json:"title"`
Views string `json:"views"`
Profiles string `json:"profiles"`
}
正如您所看到的,“Profiles”属性是一个字符串,因为profiles对象是未知的,因为其中的字段可以通过dinamically定义。
我正在尝试用以下方法解码:
json.NewDecoder(response.Body).Decode(result)
结果是Topic类型,但不起作用。 “配置文件”属性应该是什么类型才能正确解码答案?
谢谢!
答案 0 :(得分:3)
阅读评论很明显,个人资料值可以是任何类型,因此我建议您将个人资料类型声明为map[string]interface{}
。
主题变为:
type Topic struct {
Title string `json:"title"`
Views int32 `json:"views"`
Profiles map[string]interface{} `json:"profiles"`
}
答案 1 :(得分:0)
结帐https://github.com/mitchellh/mapstructure 自述文件有你可能想要的答案。
问题是,如果您的配置或编码会根据特定字段略有变化。
也许我们无法在没有先阅读"类型"的情况下填充特定结构。来自JSON的字段。我们总是可以对JSON的解码进行两次传递(读取"类型"首先,其余的后来)。但是,将它解码为map [string] interface {}结构要简单得多,读取" type"键,然后使用类似这个库的东西将其解码为适当的结构。
答案 2 :(得分:0)
如果个人资料有所不同,请在此处json.RawMessage
。在内部它是一个[]byte
,它可以被解组成其他类型,例如取决于外部文档的值。
答案 3 :(得分:0)
@include()
应该是一个结构并与容器一起启动,在这种情况下我假设它是状态,例如FB状态或推文,我在这里做了一个例子{{ 3}}
在开始解组之前,请记住在新创建的状态中实例化新配置文件。