将多个JSON类型解析为相同的结构 [英] Parsing multiple JSON types into the same struct
本文介绍了将多个JSON类型解析为相同的结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在请求一个API,该API返回包含对象数组的JSON.问题在于对象可以采用两种形式.它们可以是字符串或对象.结果示例如下:
I am requesting an API which returns JSON containing an array of objects. The problem is that the objects can take two forms. They can either be a string or an object. An example result could look like this:
[
{"name": "obj1", "key2": ["a", "b"]},
"obj2",
{"name": "obj3"}
]
字符串元素"objX"
等效于 {"name":"objX"}
.
我想将其解析为以下类型的切片:
I want to parse this into a slice of the following type:
type Obj struct {
Name string
Key2 []string
}
我该如何以合理的方式做到这一点?
How do I do this in a reasonable fashion?
推荐答案
package main
import (
"encoding/json"
"fmt"
)
type Obj struct {
Name string `json:"name"`
Key2 []string `json:"key2"`
}
func (o *Obj) UnmarshalJSON(b []byte) error {
var name string
if err := json.Unmarshal(b, &name); err == nil {
*o = Obj{}
o.Name = name
return nil
}
type Obj2 Obj
var o2 Obj2
if err := json.Unmarshal(b, &o2); err != nil {
return err
}
*o = Obj(o2)
return nil
}
const payload = `[
{"name": "obj1", "key2": ["a", "b"]},
"obj2",
{"name": "obj3"}
]
`
func main() {
var objs []*Obj
if err := json.Unmarshal([]byte(payload), &objs); err != nil {
panic(err)
}
for _, obj := range objs {
fmt.Printf("Name:%v, Key2:%v\n", obj.Name, obj.Key2)
}
}
https://play.golang.org/p/rmtSOpkYqp
这篇关于将多个JSON类型解析为相同的结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文