1 回答
TA贡献1851条经验 获得超3个赞
您可以实现自定义 json。解咒
者。为此,您需要使用命名切片类型,而不是未命名的 .[]MyInterface
在自定义取消封口实现中,您可以将 JSON 数组解封为切片,其中切片的每个元素都是一个 json。
表示相应 JSON 对象的原始消息。之后,您可以迭代原始消息切片。在循环中,从每个原始消息中仅取消编组字段,然后使用该字段的值来确定可以将完整原始消息解封到的正确类型,最后取消编组完整消息并将结果添加到接收方。Discriminator
Discriminator
type MyInterfaceSlice []MyInterface
func (s *MyInterfaceSlice) UnmarshalJSON(data []byte) error {
array := []json.RawMessage{}
if err := json.Unmarshal(data, &array); err != nil {
return err
}
*s = make(MyInterfaceSlice, len(array))
for i := range array {
base := BaseStruct{}
data := []byte(array[i])
if err := json.Unmarshal(data, &base); err != nil {
return err
}
var elem MyInterface
switch base.Discriminator {
case "Foo":
elem = new(Foo)
case "Bar":
elem = new(Bar)
}
if elem == nil {
panic("whoops")
}
if err := json.Unmarshal(data, elem); err != nil {
return err
}
(*s)[i] = elem
}
return nil
}
https://play.golang.org/p/mXiZrF392aV
- 1 回答
- 0 关注
- 93 浏览
添加回答
举报