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 关注
- 82 浏览
添加回答
举报