JSON解码未知对象

JSON解码未知对象

问题描述:

我试图解码与结构类型的JSON响应。我试图解码对象的实例如下所示: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"` 
} 

正如你可以看到,在“配置文件”属性是一个字符串,因为配置文件对象是未知的,因为它里面的字段可以被定义。

我试图用解码此:

json.NewDecoder(response.Body).Decode(result) 

如果结果是一个类型的话题,但没有工作。 “Profiles”属性应该是什么类型才能正确解码答案?

谢谢!

+0

“配置文件”值始终是字符串吗? – JimB

+0

您是否有''profile'中您感兴趣的字段列表?或者您必须阅读所有字段并对它们进行操作,无论它们是什么? – nu11p01n73R

+0

配置文件值可以是任何值。我唯一需要的是能够将该响应发送到Web客户端,而无需修改或读取任何内容(我从第三方api中检索该值,然后返回到客户端) – Lucia

阅读评论,很明显,配置文件值可以是任何类型,因此,我建议您将配置文件类型声明为map[string]interface{}
主题变成:

type Topic struct { 
    Title   string `json:"title"` 
    Views   int32 `json:"views"` 
    Profiles  map[string]interface{} `json:"profiles"` 
} 
+0

您在结构中存在拼写错误。应该是“字符串”。尽管我不能提出少于10个变化字符的编辑。 – RayfenWindspear

退房https://github.com/mitchellh/mapstructure 自述有一个答案,你可能找。

问题是如果您有配置或编码根据特定字段略有变化。

也许我们无法先从JSON中读取“type”字段来填充特定的结构。我们总是可以在解码JSON时做两遍(首先阅读“类型”,稍后再阅读“类型”)。然而,将它解码成map [string] interface {}结构要简单得多,读取“type”键,然后使用类似这个库的东西将它解码为适当的结构。

如果配置文件可能会有所不同,您应该在这里采取json.RawMessage。在内部,它是一个[]byte,后者可以解组为其他类型,例如,取决于外部文档的值。

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

Profiles应该是一个结构,并与容器一起发起的,在这种情况下,我认为这是一个状态,比如FB地位或鸣叫我做了这里https://play.golang.org/p/tG90idakLP

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