为了创建类似表的结构,我在以前的应用程序中以以下格式序列化了行数据:
{ "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?
MarshalJSON
Row
最简洁的答案是不。该语言不允许您将任何类型(切片或映射)嵌入结构中。
只需使用一个map[string]interface{}。处理以下事实:“ key1”和“ key2”的值是字符串,而其他所有值在其他地方都是浮点数。这实际上是获得该输出的唯一方法。您可以使问题变得更复杂(例如,将其转换为更像您的类型的东西),但是如果您不愿意实施MarshalJSON将产生所需结果的唯一模型,则map[string]interface{}
map[string]interface{}