为了账号安全,请及时绑定邮箱和手机立即绑定

如何将地图嵌入到结构中以使其具有平面 json 表示

如何将地图嵌入到结构中以使其具有平面 json 表示

Go
DIEA 2021-10-18 14:15:34
为了创建类似表格的结构,我在之前的应用程序中按以下格式序列化了我的行数据:{ "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,        },    }}但这在我的 'Row' 对象中创建了一个字段 'RowData' 字段,而不是将 RowData 中的条目附加到我想要的平面 json 对象中:{ "key1": "...", "key2": "...", "RowData": { "15/04": 1.3, "15/05": 1.2, .... "17/08": 0.8 } }我想知道,是否有一种方法可以将映射或切片嵌入到结构中,以便生成的 json 对象是平面的,而无需MarshalJSON在 type 上定义函数Row?
查看完整描述

2 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

只需使用一个map[string]interface{}. 处理这样一个事实,即“key1”和“key2”的值是字符串,而其他所有内容都是其他地方的浮点数。这确实是您获得该输出的唯一方法。您可以根据需要使问题变得尽可能复杂(例如转换为更像您的类型或其他类型)但如果您反对实现MarshalJSON唯一能够产生您想要的结果的模型是map[string]interface{}


查看完整回答
反对 回复 2021-10-18
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我知道已经有一个可接受的答案,但实际上您可以获得指定的“所需的平面 json 对象”。


“RowData”不完全是map[string]float; 获取它的类型将产生“main.RowData”(如果它在包 main 中)。它可以嵌入到结构中。以这个例子,改编自原来的帖子:


package main


import (


    "encoding/json"

    "fmt"

)


type Row struct {

    Key1 string

    Key2 string

    RowData

}


type RowData map[string]float64


func main() {

    row := Row{

        RowData: make(map[string]float64),

    }

    row.RowData["15/04"] = 1.3

    row.RowData["15/05"] = 1.2

    row.RowData["17/08"] = 0.8

    row.Key1 = "value one"

    row.Key2 = "value two"


    flatJSON, _ := json.Marshal(row)

    fmt.Println(string(flatJSON))

}

这将产生:


{"Key1":"value one","Key2":"value two","RowData":{"15/04":1.3,"15/05":1.2,"17/08":0.8}}

字段名称必须大写才能导出,但您可以使用结构标记使它们与问题中指定的确切字符串匹配。


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信