大家好,今天本人给大家带来文章《解析切片中的两种不同结构》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!
问题内容我的输入 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 的方法中实现该逻辑,从而实现 the json.Unmarshaler interface。这将为您提供您正在寻找的复合类型:
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-
我认为 Answer of Peter 很棒。
选项 1:
type paralleldata [
urldata urldata
formdata formdata
]
如果您需要上述结构,那么您可以将其定义为
type urldata struct {
url string `json:"url,omitempty"`
name string `json:"name,omitempty"`
}
type formdata struct {
formname string `json:"formname,omitempty"`
formnumber string `json:"formnumber,omitempty"`
formslug string `json:"formslug,omitempty"`
}
type paralleldata struct {
urldata urldata `json:"urldata,omitempty"`
formdata formdata `json:"formdata,omitempty"`
}
在这种情况下,您的 json 将如下所示
[
{
"urldata":{
"url":"test.url",
"name":"testname"
}
},
{
"formdata":{
"formname":"test - 2018",
"formnumber":"43",
"formslug":"test-2018"
}
}
]
选项 2:
您已提供以下 json:
[
{
"url":"test.url",
"name":"testname"
},
{
"formname":"test - 2018",
"formnumber":43,
"formslug":"test-2018"
}
]
如果你的json确实像这样,那么你可以使用以下struct
type urldata struct {
url string `json:url`
name string `json:name`
}
type formdata struct {
formname string `json:formname`
formnumber int `json:formnumber`
formslug string `json:formslug`
}
type paralleldata struct {
urldata
formdata
}
对于这两个选项,您都可以像这样解组您的 json
var parallelData []ParallelData
err := json.Unmarshal([]byte(str), ¶llelData)
if err != nil {
panic(err)
}
fmt.Println(parallelData)
请参阅playground中的选项1
请参阅playground中的选项2
以上就是《解析切片中的两种不同结构》的详细内容,更多关于的资料请关注编程网公众号!