gpt4 book ai didi

json - 编码类型时如何将方法结果嵌入到 JSON 输出中?

转载 作者:IT王子 更新时间:2023-10-29 00:52:33 30 4
gpt4 key购买 nike

我正在寻找一种干净的方法来将方法的返回值嵌入到类型/值的 JSON 编码中。如果我不需要编写自定义 JSON 编码器,那就太好了。

例如,如果 User 类型有 FirstNameLastName 字段以及一个 FullName() 方法,我如何轻松地嵌入一个 full_name 字段转换成 JSON 输出?

 type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}

func (u User) FullName() string {
return fmt.Sprintf("%s %s", u.FirstName, u.LastName)
}

预期的 JSON:

 {
"first_name": "John",
"last_name": "Smith",
"full_name": "John Smith"
}

最佳答案

如果不提供一些 编码器,这将无法轻松处理。我知道您不想编写 MarshalJSON 并手动执行所有操作,但您可以尝试在自定义编码器中扩展您的结构,而不是依赖默认编码器。概念证明:

type User struct {
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
}

func (u *User) FullName() string {
return fmt.Sprintf("%s %s", u.FirstName, u.LastName)
}

func (u User) MarshalJSON() ([]byte, error) {
type rawUser User // raw struct, without methods (and marshaller)
// Marshal rawUser with an extension
return json.Marshal(struct {
rawUser
FullName string `json:"full_name"`
}{rawUser(u), u.FullName()})
}

[ play ]

您需要将 User 转换为 rawUser 以去除所有方法——否则您将陷入 MarshalJSON 的无限循环。此外,我选择了 MarshalJSON 来操作副本而不是指针,以确保 json.Marshal(user) 将产生与 json.Marshal(&user )

这不是单行代码,而是隐藏了标准接口(interface)背后的复杂性,因此您无需记住有一种特殊的、非标准的方法可以将您的结构转换为 JSON。

关于json - 编码类型时如何将方法结果嵌入到 JSON 输出中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30273286/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com