首页 > 后端开发 > Golang > 使用自定义 MarshalJSON() 方法嵌入结构时如何正确 MarshalJSON()?

使用自定义 MarshalJSON() 方法嵌入结构时如何正确 MarshalJSON()?

Susan Sarandon
发布: 2024-12-16 07:22:10
原创
376 人浏览过

How to Correctly MarshalJSON() When Embedding Structs with Custom MarshalJSON() Methods?

使用自定义 MarshalJSON() 方法嵌入结构的惯用方法

使用自定义 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()

  • 从 Person 结构中删除 MarshalJSON() 方法。
  • 相反,创建一个单独的类型(例如,Name)实现 MarshalJSON()。
  • 更新 Person 结构以使用新类型(例如, Person{Name: Name{"Bob"}})。
  • Employee 结构将从 Name 类型继承自定义 JSON 编码。

选项 2:实现 MarshalJSON( ) 在外部类型上

  • 在 Employee 上实现 MarshalJSON() 方法struct。
  • 调用嵌入的 Person 实例的 MarshalJSON() 方法来获取其 JSON 表示。
  • 将 Person 的 JSON 解组为中间表示(例如,map[string]interface{})。
  • 将外部结构体的字段添加到中间表示并将其编组到JSON.

注意:这两个选项都需要一些手动处理,并且可能会影响最终 JSON 输出中字段的顺序。

以上是使用自定义 MarshalJSON() 方法嵌入结构时如何正确 MarshalJSON()?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板