假设我已经编写了以下代码段。在操场上的完整代码在这里为那些倾斜。
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结构中。也许是一个体裁:
Book
{ "Title": "Catch-22", "Author": "Joseph Heller", "Genre": "Satire" }
我可以使用MarshalJSON()将任意字段添加到上的JSON有效载荷Marshal()吗?就像是:
MarshalJSON()
Marshal()
func (b *Book) MarshalJSON() ([]byte, error) { // some code }
其他答案使我认为这应该可行,但是我正在努力弄清实现方式。
这是比我上一个更好的答案。
type FakeBook Book func (b Book) MarshalJSON() ([]byte, error) { return json.Marshal(struct { FakeBook Genre string }{ FakeBook: FakeBook(b), Genre: "Satire", }) }
由于匿名结构字段是“合并的”(有一些其他注意事项),我们可以使用它来避免重新映射各个字段。请注意,使用该FakeBook类型可以避免发生无限递归。
FakeBook
游乐场:http: //play.golang.org/p/21YXhB6OyC