假设我写了下面的代码片段.那些倾斜的操场上的完整代码
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让我觉得这应该是可能的,但我正在努力弄清楚实现.
这是比以前更好的答案.
原文链接:https://www.f2er.com/go/186802.htmltype FakeBook Book func (b Book) MarshalJSON() ([]byte,error) { return json.Marshal(struct { FakeBook Genre string }{ FakeBook: FakeBook(b),Genre: "Satire",}) }
由于匿名结构字段被“合并”(有一些额外的注意事项),我们可以使用它来避免重映射单个字段.请注意使用FakeBook类型以避免否则会发生无限递归.