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

Chr*_*her 19 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))
}
Run Code Online (Sandbox Code Playgroud)

此代码完全按照我的预期输出以下内容:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller"
}
Run Code Online (Sandbox Code Playgroud)

假设我想在JSON输出中添加一个字段而不将其包含在Book结构中.也许是一种类型:

{
  "Title": "Catch-22",
  "Author": "Joseph Heller",
  "Genre": "Satire"
}
Run Code Online (Sandbox Code Playgroud)

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

func (b *Book) MarshalJSON() ([]byte, error) {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

其他答案让我觉得这应该是可能的,但我正在努力弄清楚实现.

Eva*_*van 26

这是比我之前的答案更好的答案.

type FakeBook Book

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

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

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