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

标签 json go

假设我编写了以下代码片段。 Playground 上的完整代码here适合那些喜欢的人。

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() 将任意字段添加到 Marshal() 上的 JSON 有效负载吗?比如:

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

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

最佳答案

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

type FakeBook Book

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

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

Playground :http://play.golang.org/p/21YXhB6OyC

关于json - 我可以使用 MarshalJSON 将任意字段添加到 golang 中的 json 编码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23045884/

相关文章:

jquery - 通过jquery查找json数据的最佳方法

java - 在循环中解析 json 时返回 null - android

go - 无法访问同一个包中的私有(private)方法进行测试

linux - 了解 Linux 写入性能

go - 使用自定义 http 处理程序的 goRelic 代理捕获 HTTP 指标

C# JSON.Net 使用 LINQ 解析并获取与某个值匹配的所有元素的列表

javascript - 从 JSON 数组中查找并删除 json 对象

php - 如何获取一个类的所有公共(public)属性作为json?

pointers - 如何在Go中通过指针接收器方法修改简单类型的值?

json - 结构列表作为 json golang