一尘不染

在切片中解组2个不同的结构

go

我输入的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
]

阅读 235

收藏
2020-07-02

共1个答案

一尘不染

使用两步过程进行编组。首先,解组一个任意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-

2020-07-02