我正在使用JSON,它返回三种不同的对象类型“项目”,“类别”和“修饰符”。 An example of the JSON can be viewed here.我为三种类型的对象创建了模型。但是当我解组时,我选择了一种类型来解组整个JSON。(我知道这不是正确的方法...)然后我尝试根据不同的类型来解析不同的项目,如json字段“类型”,然后将该对象附加到适当类型的切片中。我遇到错误,因为我不知道如何解组其中具有不同字段且具有不同类型的JSON。
解封包含不同对象的JSON的正确方法是什么,每个对象都有各自的字段?
创建包含所有可能字段的“超级模型”然后解组的解决方案吗?
我还很陌生,希望您能提出任何建议。谢谢!
答案 0 :(得分:3)
如果实现json.Unmarshaler,则可以定义一个将每个项目类型解析为相关结构的结构。
示例:
// Dynamic represents an item of any type.
type Dynamic struct {
Value interface{}
}
// UnmarshalJSON is called by the json package when we ask it to
// parse something into Dynamic.
func (d *Dynamic) UnmarshalJSON(data []byte) error {
// Parse only the "type" field first.
var meta struct {
Type string
}
if err := json.Unmarshal(data, &meta); err != nil {
return err
}
// Determine which struct to unmarshal into according to "type".
switch meta.Type {
case "product":
d.Value = &Product{}
case "post":
d.Value = &Post{}
default:
return fmt.Errorf("%q is an invalid item type", meta.Type)
}
return json.Unmarshal(data, d.Value)
}
// Product and Post are structs representing two different item types.
type Product struct {
Name string
Price int
}
type Post struct {
Title string
Content string
}
用法:
func main() {
// Parse a JSON item into Dynamic.
input := `{
"type": "product",
"name": "iPhone",
"price": 1000
}`
var dynamic Dynamic
if err := json.Unmarshal([]byte(input), &dynamic); err != nil {
log.Fatal(err)
}
// Type switch on dynamic.Value to get the parsed struct.
// See https://tour.golang.org/methods/16
switch dynamic.Value.(type) {
case *Product:
log.Println("got a product:", dynamic.Value)
case *Post:
log.Println("got a product:", dynamic.Value)
}
}
输出:
2009/11/10 23:00:00得到了一个产品:&{iPhone 1000}
提示:如果您有动态对象列表,只需解析为Dynamic
的一部分即可:
var items []Dynamic
json.Unmarshal(`[{...}, {...}]`, &items)
示例输出:
[&{iPhone 1000}&{A Good Post Lorem ipsum ...}]
答案 1 :(得分:1)
我认为https://github.com/mitchellh/mapstructure也适合您的用例。