【发布时间】:2015-12-03 18:48:20
【问题描述】:
一个不在我控制范围内的 api 端点返回带有关键人员的 json,该关键人员可以具有 2 种类型之一。
json:
{
"people":{
"admin":{
"Name": "John Smith",
"Address": "123 main street"
},
"user":{
"Name": "Jane Doe",
"Address": "321 broad street",
}
}
Json 类型 2:
{
"people":[
{
"name": "Jon Snow",
"pet": "Ghost"
},
{
"name": "Sansa Stark",
"pet": "Lady",
}
]
}
对于第一种类型,我可以这样创建结构
type People struct {
Admin *Person `json:"admin,omitempty"`
User *Person `json:"user,omitempty"`
}
type Person struct {
Name string `json:"name,omitempty"`
Address string `json:"adress,omitempty"`
}
或者第二种是
type People []*Person
type Person struct{
Name string `json:"name,omitempty"`
Pet string `json:"pet,omitempty"`
}
有没有办法设计一个结构,以便我可以解组任何类型的响应?
【问题讨论】:
-
你当然可以,但只尝试一种类型可能会容易得多,如果失败了尝试另一种。其他几件小事值得一提; 1) 你绝对可以有一个带有
Name、Address和Pet的Person定义,2) 你的第一个json sn-p 是一个没有有效的右括号。 3) 在这两种情况下,您在此处发布的模型中都没有考虑到一个外部对象(即,它是一个包含名为 people 的数组的对象,该数组具有 person 类型的对象,而不是具有 person 类型的对象的数组) . -
更简单可能不正确。为了做得好,你仍然需要编写一些代码,我只是认为它更容易推理。我建议在你解组的包中公开一个类型或接口,同时隐藏你使用的实际类型。您公开的内容应该由对消费者更直观的内容决定。就像数组响应中可能有超过 2 个人一样,我可能只返回一个数组。也许我会添加一个
Role字段并在响应为第一种形式时分配"admin"或"user"。如果它始终是管理员和用户,我只会返回第一种类型。