我的输入json数据是这样的(无法从外部资源更改):
[{
"Url": "test.url",
"Name": "testname"
},{
"FormName": "Test - 2018",
"FormNumber": 43,
"FormSlug": "test-2018"
}]
Run Code Online (Sandbox Code Playgroud)
我有两个结构总是匹配数组中的数据:
type UrlData struct{
"Url" string `json:Url`
"Name" string `json:Name`
}
type FormData struct{
"FormName" string `json:FormName`
"FormNumber" string `json:FormNumber`
"FormSlug" string `json:FormSlug`
}
Run Code Online (Sandbox Code Playgroud)
显然,下面的代码不起作用,但是可以在顶层(或其他方面)声明如下内容:
type ParallelData [
urlData UrlData
formData FormData
]
Run Code Online (Sandbox Code Playgroud)
使用两步过程进行解组.首先,解组任意JSON列表,然后将该列表的第一个和第二个元素解组为各自的类型.
您可以在名为UnmarshalJSON的方法中实现该逻辑,从而实现json.Unmarshaller接口.这将为您提供您正在寻找的复合类型:
type ParallelData struct {
UrlData UrlData
FormData FormData
}
// UnmarshalJSON implements json.Unmarshaler.
func (p *ParallelData) UnmarshalJSON(b []byte) error {
var records []json.RawMessage
if err := json.Unmarshal(b, &records); err != nil {
return err
}
if len(records) < 2 {
return errors.New("Short JSON array")
}
if err := json.Unmarshal(records[0], &p.UrlData); err != nil {
return err
}
if err := json.Unmarshal(records[1], &p.FormData); err != nil {
return err
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
在操场上试试:https://play.golang.org/p/QMn_rbJj-P-