如何在结构中包含许多结构?

时间:2017-08-23 04:51:22

标签: json go struct

我有一个像这样被称为类的结构。

type ClassDetails struct {
ClassNumber int `json:"classNumber"`
Names []string `json:names`}

我手动创建了这样的东西。

type Subject struct {
Math ClassDetails `json:"math"`
Science ClassDetails `json:"science"`}

我想在飞行中这样做。在获取信息时向Subject添加更多ClassDetails,但我不能使用类型类的数组。  如何才能做到这一点?我还需要将类的名称添加为json标记。 我得到的结构应该包含这样的值。

{
    "classes": {
        "school": "MayorWestHigh",
        "math": [{
                "classNumber": "1",
                "names": ["aaron", "baron", "cathy"]
            },
            {
                "classNumber": "2",
                "names": ["aaron", "baron", "cathy"]
            }
        ],
        "science": [{
            "classNumber": "1",
            "names": ["ted", "baron", "isiah"]
        }],
        "geography": [{
            "classNumber": "1",
            "names": ["peter", "glen", "joe"]
        }]

    }
}

1 个答案:

答案 0 :(得分:2)

不是静态地定义每个主题,而是简单地使用主题名称中的地图=>班级细节的数组?

通过使用如上所述的地图,并通过将地图嵌入到结构中,您可以非常接近所需的JSON,如下所示:

type ClassDetails struct {
    ClassNumber int      `json:"classNumber"`
    Names       []string `json:names`
}

type Subjects map[string][]ClassDetails

type Classes struct {
    School string `json:"school"`
    Subjects
}

上面的Classes结构的一个实例将填写所需JSON的以下部分:

{
  "classes": {
    ... the Classes instance goes here...
  }
}

剩余的外部对象可以按如下方式构造:

c := Classes{...}
outer := map[string]Classes{"classes": c}

outer对象的JSON编组,初始化正确的数据,几乎完全达到你的JSON(为了完全匹配你必须将ClassNumber转换为字符串类型)

这是一个Go Playground链接,可以使用您想要的确切数据初始化这些结构并打印出您的JSON:https://play.golang.org/p/HFMbHtY2os

编辑:这仍然与您问题中的JSON不完全匹配,因为它会在其中添加一个名为“Subjects”的新对象。问题是JSON中"classes"内的对象混合了类型,Go不能声明动态结构域。

如果您真的必须使用该JSON结构,则需要使用更通用的map[string]interface{}来允许对象层次结构中同一级别的混合类型。这是另一个具有正确实现的Go Playground链接:https://play.golang.org/p/rlYTYGofSI