假设我编写了以下代码片段。 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/