2 回答

TA貢獻1794條經驗 獲得超8個贊
由于 2 種值類型發生沖突(一種是結構,另一種是結構的一部分),因此即使使用捕獲所有解決方案(如 ),將其封裝到單個類型中也會變得很混亂。interface{}
最簡單的解決方案是呈現兩種不同的類型并封送到其中任何一個,以查看哪個“有效”:
func unmarsh(body []byte) (*type1, *type2, error) {
var (
t1 type1
t2 type2
)
err := json.Unmarshal(body, &t1)
if err == nil {
return &t1, nil, nil
}
err = json.Unmarshal(body, &t2)
if err == nil {
return nil, &t2, nil
}
return nil, nil, err
}
在您的示例中,兩種類型將是:
type type1 struct {
Application struct {
Instance []struct {
InstanceID string `json:"instanceId"`
} `json:"instance"`
} `json:"application"`
}
type type2 struct {
Application struct {
Instance struct {
InstanceID string `json:"instanceId"`
} `json:"instance"`
} `json:"application"`
}
工作示例:https://play.golang.org/p/Kma32gWfghb

TA貢獻1785條經驗 獲得超8個贊
一個更干凈的解決方案是自定義的拆包器:
type Instances []Instance
func (i *Instances) UnmarshalJSON(in []byte) error {
if len(in)>0 && in[0]=='[' {
var a []Instance
if err:=json.Unmarshal(in,&a); err!=nil {
return err
}
*i=a
return nil
}
var s Instance
if err:=json.Unmarshal(in,&s) ; err!=nil {
return err
}
*i=[]Instance{s}
return nil
}
這會將對象解封為 1 的切片。
@mkopriva提供了更緊湊的解決方案:
func (i *Instances) UnmarshalJSON(in []byte) error {
if len(in) > 0 && in[0] == '[' {
return json.Unmarshal(in, (*[]Instance)(i))
}
*i = Instances{{}}
return json.Unmarshal(in, &(*i)[0])
}
- 2 回答
- 0 關注
- 88 瀏覽
添加回答
舉報