1 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
您可以實(shí)現(xiàn)自定義 json。解咒
者。為此,您需要使用命名切片類型,而不是未命名的 .[]MyInterface
在自定義取消封口實(shí)現(xiàn)中,您可以將 JSON 數(shù)組解封為切片,其中切片的每個(gè)元素都是一個(gè) json。
表示相應(yīng) JSON 對象的原始消息。之后,您可以迭代原始消息切片。在循環(huán)中,從每個(gè)原始消息中僅取消編組字段,然后使用該字段的值來確定可以將完整原始消息解封到的正確類型,最后取消編組完整消息并將結(jié)果添加到接收方。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 關(guān)注
- 120 瀏覽
添加回答
舉報(bào)