1 回答
TA貢獻1820條經驗 獲得超10個贊
由于B嵌入A,A.UnmarshalJSON()被暴露為B.UnmarshalJSON(). 因此,B實施json.Unmarshaler并因此json.Unmarshal()調用B.UnmarshalJSON()僅解組A的字段。B.Z這就是沒有從 JSON 中設置的原因。
這是我能想到的最簡單的方法,可以根據您不更改數據類型的約束使其工作A:
讓 B 嵌入另一個包含 A 中不包含的字段的結構 C。
為 B 編寫一個 UnmarshalJSON() 方法,該方法將相同的 JSON 解組為 BA 和 BC 使用不在 A 中的字段定義另一個類型 C 的優點是您可以將其解組委托給 json 包。
使用新B.UnmarshalJSON()方法,您現在也可以完全控制解組外部字段A。
type A struct {
X bool `json:"x"`
Y bool `json:"y"`
}
func (a *A) UnmarshalJSON(bytes []byte) error {
// the special unmarshalling logic here
}
type C struct {
Z int `json:"z"`
}
type B struct {
A
C
}
func (b *B) UnmarshalJSON(bytes []byte) error {
if err := json.Unmarshal(bytes, &b.A); err != nil {
return err
}
if err := json.Unmarshal(bytes, &b.C); err != nil {
return err
}
return nil
}
- 1 回答
- 0 關注
- 120 瀏覽
添加回答
舉報
