我输入的json数据是此数据(无法从外部资源更改):
[{ "Url": "test.url", "Name": "testname" },{ "FormName": "Test - 2018", "FormNumber": 43, "FormSlug": "test-2018" }]
我有两个结构将始终匹配数组中的数据:
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` }
显然,下面的代码不起作用,但是有可能在顶层(或其他方面)声明类似以下内容的代码:
type ParallelData [ urlData UrlData formData FormData ]
使用两步过程进行编组。首先,解组一个任意JSON的列表,然后将该列表的第一个和第二个元素解组为各自的类型。
您可以在名为UnmarshalJSON的方法中实现该逻辑,从而实现json.Unmarshaler接口。这将为您提供您要寻找的化合物类型:
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 }
在操场上尝试:https : //play.golang.org/p/QMn_rbJj-P-