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 關注
- 114 瀏覽
添加回答
舉報