这里有一个接口SpecificTemplate
嵌套在结构Template
中:
package main
import (
"encoding/json"
"fmt"
)
type SpecificTemplate interface {
GetLabel() string
}
type TemplateA struct {
Label string `json:"label"`
}
func (t TemplateA) GetLabel() string {
return t.Label
}
type Template struct {
Id int64 `json:"id"`
SpecificTemplate
}
func main() {
ta := TemplateA{
Label: `label1`,
}
t := Template{
Id: 1,
SpecificTemplate: ta,
}
data, _ := json.Marshal(t)
fmt.Println(string(data))
}
应该是
{
"id":1,
"SpecificTemplate":{
"label":"label1"
}
}
我想知道如何在相同级别显示json,就像:
{
"id":1,
"label":"label1"
}
答案 0 :(得分:0)
这取决于您想要达到的复杂程度...
如果只想公开标签,我应该建议您创建一个MarshalJSON函数,就像这样...
func (t Template) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
Id int64 `json:"id"`
Label string `json:"label"`
}{
Id: t.Id,
Label: t.SpecificTemplate.GetLabel(),
})
}
有了这个,您的json.Marshal(t)
将调用此函数,并且您将收到一个扁平的json ...
但是,如果您想从模板中公开更多字段,则应使用反射,如伊恩·邓肯(Iain Duncan)在其评论中指出的那样