一尘不染

如何将地图嵌入结构中,使其具有平面json表示形式

go

为了创建类似表的结构,我在以前的应用程序中以以下格式序列化了行数据:

{ "key1": "...", "key2": "...", "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8 }

现在,我试图用Go重写它,以便通过动手学习语言。在Go中,可以通过将两个结构嵌入到另一个结构中来将它们组合在一起。从该结构中封送的json将具有一个平面结构,即,生成的json对象将具有第一和第二个结构的字段的并集,而不会嵌套。这是一个示例:https
:
//play.golang.org/p/jbJykip7pw(来自http://attilaolah.eu/2014/09/10/json-
and-struct-composition-in-go/)

我猜想我也可以将地图嵌入结构中,以便可以使用以下类型定义在json上进行编组:

type Row struct {
    key1 string
    key2 string
    RowData
}

type RowData map[string]float64

...
func main() {
    row := Row{
        "...",
        "...",
        RowData{
            "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8,
        },
    }
}

但这在我的“行”对象中创建了一个字段“行数据”字段,而不是将行数据中的条目追加到所需的平面json对象中:

{ "key1": "...", "key2": "...", "RowData": { "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8 } }

我想知道,是否有一种方法可以将地图或切片嵌入到结构中,以使生成的json对象平坦,而无需MarshalJSON在type上定义函数Row


阅读 263

收藏
2020-07-02

共1个答案

一尘不染

最简洁的答案是不。该语言不允许您将任何类型(切片或映射)嵌入结构中。

只需使用一个map[string]interface{}。处理以下事实:“ key1”和“
key2”的值是字符串,而其他所有值在其他地方都是浮点数。这实际上是获得该输出的唯一方法。您可以使问题变得更复杂(例如,将其转换为更像您的类型的东西),但是如果您不愿意实施MarshalJSON将产生所需结果的唯一模型,则map[string]interface{}

2020-07-02