如何为嵌套在struct中的接口在同一级别显示json?

时间:2019-05-17 07:06:18

标签: json go

这里有一个接口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"
}

1 个答案:

答案 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)在其评论中指出的那样