登录
首页 >  Golang >  Go问答

我可以使用 MarshalJSON 将任意字段添加到 golang 中的 json 编码吗?

来源:Golang技术栈

时间:2023-04-15 21:54:56 361浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《我可以使用 MarshalJSON 将任意字段添加到 golang 中的 json 编码吗?》带大家来了解一下我可以使用 MarshalJSON 将任意字段添加到 golang 中的 json 编码吗?,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

假设我编写了以下代码片段。对于那些有兴趣的人来说,操场上的完整代码在这里。

type Book struct {
  Title        string
  Author       string
}

func main() {
  ms := Book{"Catch-22", "Joseph Heller"}
  out, err := json.MarshalIndent(ms, "", "  ")
  if err != nil {
    log.Fatalln(err)
  }
  fmt.Println(string(out))
}

此代码输出以下内容,完全符合我的预期:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller"
}

假设我想在 JSON 输出中添加一个字段,但不将其包含在Book结构中。也许是一种流派:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller",
  "Genre": "Satire"
}

我可以使用MarshalJSON()向 JSON 有效负载添加任意字段Marshal()吗?就像是:

func (b *Book) MarshalJSON() ([]byte, error) {
    // some code
}

其他答案让我认为这应该是可能的,但我正在努力弄清楚实施。

正确答案

这是一个比我以前的答案更好的答案。

type FakeBook Book

func (b Book) MarshalJSON() ([]byte, error) {
    return json.Marshal(struct {
        FakeBook
        Genre string
    }{
        FakeBook: FakeBook(b),
        Genre:    "Satire",
    })
}

由于匿名结构字段是“合并的”(有一些额外的考虑),我们可以使用它来避免重新映射各个字段。请注意使用FakeBook类型以避免否则会发生的无限递归。

游乐场: http ://play.golang.org/p/21YXhB6OyC

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>