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

标签 json struct go marshalling

我正在寻找一种干净的方法来将方法的返回值嵌入到类型/值的 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/

相关文章:

java - Apache Camel : Convert JSON to a POJO using Camel methods

Android Retrofit 2.0 JSON 文档未完全消耗

无法在头文件中分配结构变量

go - 更新结构中的值不起作用

c# - 应该和 Json.NET : This passes? ! JToken.Parse ("{}").ShouldBe ("hello");

c++ - 从结构转换为浮点*

methods - 结构方法的Rust生命周期推断

go - 在 Go slice 中,为什么 s[lo :hi] end at element hi-1?

arrays - 自己结构数组的JSON编码

javascript - 在 Node 服务器上使用 mongoose 将分层 Node 从 json 文件保存到 mongodb 中