使用自定义 MarshalJSON() 嵌入结构
何时使用自定义 MarshalJSON() 方法嵌入结构,外部结构的字段被提升为提升类型,覆盖嵌入结构的 MarshalJSON() 方法。这可能会在编组外部结构时导致意外结果。
问题:
考虑以下结构:
type Person struct { Name string `json:"name"` } func (p *Person) MarshalJSON() ([]byte, error) { return json.Marshal(struct { Name string `json:"name"` }{ Name: strings.ToUpper(p.Name), }) } type Employee struct { *Person JobRole string `json:"jobRole"` }
编组 Employee 实例产生意想不到的结果:
p := Person{"Bob"} e := Employee{&p, "Sales"} output, _ := json.Marshal(e) fmt.Printf("%s\n", string(output))
输出:
{"name": "BOB"}
尽管在 Employee 实例上设置了 jobRole 字段,但仍丢失。
解决方案:
选项1:避免在嵌入类型上使用 MarshalJSON()
选项 2:实现 MarshalJSON( ) 在外部类型上
注意:这两个选项都需要一些手动处理,并且可能会影响最终 JSON 输出中字段的顺序。
以上是使用自定义 MarshalJSON() 方法嵌入结构时如何正确 MarshalJSON()?的详细内容。更多信息请关注PHP中文网其他相关文章!