假设我写了下面的代码片段.那些倾斜的操场上的完整代码
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输出中添加一个字段,而不将其包含在“书”结构中.也许一个类型:
{
"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类型以避免否则会发生无限递归.

