【问题标题】:How to have many structs inside a struct?如何在一个结构中拥有多个结构?
【发布时间】:2017-08-23 13:41:52
【问题描述】:

我有一个这样的被调用类的结构。

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

我手动创建了类似的东西。

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

我想即时执行此操作。当我获得信息时,向主题添加更多的 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"]
        }]

    }
}

【问题讨论】:

标签: json go struct


【解决方案1】:

与其静态定义每个主题,不如简单地使用主题名称中的映射 => 类详细信息数组?

一种方法可以让您非常接近所需的 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 不完全匹配,因为它会在其中添加一个名为“主题”的新对象。问题是您的 JSON 中 "classes" 内部的对象混合了类型,并且 Go 无法声明动态结构字段。

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

【讨论】:

  • 您已将不同的主题包装到类中。我不能使用一个类数组。它应该只是一个具有多个类对象的结构。
  • 我用一个使用map[string]interface{}的新游乐场链接编辑了我的答案
  • 谢谢。我现在可以接受泛型类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2013-06-23
  • 2022-12-07
相关资源
最近更新 更多