JSON解码未知对象

时间:2017-02-24 15:19:16

标签: json go

我正在尝试使用结构类型解码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类型,但不起作用。 “配置文件”属性应该是什么类型才能正确解码答案?

谢谢!

4 个答案:

答案 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,它可以被解组成其他类型,例如取决于外部文档的值。

请参阅https://golang.org/pkg/encoding/json/#RawMessage和示例。

答案 3 :(得分:0)

@include()应该是一个结构并与容器一起启动,在这种情况下我假设它是状态,例如FB状态或推文,我在这里做了一个例子{{ 3}}

在开始解组之前,请记住在新创建的状态中实例化新配置文件。