一尘不染

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

go

假设我已经编写了以下代码段。在操场上的完整代码在这里为那些倾斜。

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
}

其他答案使我认为这应该可行,但是我正在努力弄清实现方式。


阅读 336

收藏
2020-07-02

共1个答案

一尘不染

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

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

2020-07-02