我正在调用一个API,它会像这样返回Json对象:
{
name: "XXX"
type: "TYPE_1"
shared_fields: {...}
type_1_fields: {...}
..
type_2_fields: {...}
}
根据不同的类型,此对象将具有不同类型的字段,但这些字段对于不同类型是确定的。 因此,我将Json字符串解组以映射[string] interface {}以获取不同的类型,但是如何将这些map [string] interface {}转换为某个结构?
var f map[string]interface{}
err := json.Unmarshal(b, &f)
type := f["type"]
switch type {
case "type_1":
//initialize struct of type_1
case "type_2":
//initialize struct of type_2
}
答案 0 :(得分:1)
对于这种两步json解码,您可能想要查看json.RawMessage。它允许您推迟处理json响应的部分内容。文档中的示例显示了如何。
答案 1 :(得分:0)
一种方法是使用构造函数(以New…
开头的函数)将地图作为输入参数。
第二种方式,在我看来慢得多,就是将解组重做为正确的结构类型。
答案 2 :(得分:0)
如果类型足够不同并且您想偷懒,可以尝试以每种格式对其进行解码:
f1 := type1{}
err := json.Unmarshal(b, &f1)
if err == nil {
return f1
}
f2 := type2{}
err := json.Unmarshal(b, &f2)
if err == nil {
return f2
}
...
如果对象相似,或者您希望不那么懒惰,则可以解码类型,然后执行以下操作:
type BasicInfo struct {
Type string `json:"type"`
}
f := BasicInfo{}
err := json.Unmarshal(b, &f)
switch f.Type {
case "type_1":
//initialize struct of type_1
case "type_2":
//initialize struct of type_2
}