我无法弄清楚如何将 JSON 文件的“子部分”加载到地图元素中。背景:我试图解组具有严格结构的有点复杂的配置文件,因此我认为最好解组为“静态”结构而不是接口{}。例如,这是一个简单的 JSON 文件:{ "set1": { "a":"11", "b":"22", "c":"33" }}此代码有效:package mainimport ( "encoding/json" "fmt" "io/ioutil" "os")type JSONType struct { FirstSet ValsType `json:"set1"`}type ValsType struct { A string `json:"a"` B string `json:"b"` C string `json:"c"`}func main() { file, e := ioutil.ReadFile("./test1.json") if e != nil { fmt.Println("file error") os.Exit(1) } var s JSONType json.Unmarshal([]byte(file), &s) fmt.Printf("\nJSON: %+v\n", s)}但这不会:package mainimport ( "encoding/json" "fmt" "io/ioutil" "os")type JSONType struct { FirstSet ValsType `json:"set1"`}type ValsType struct { Vals map[string]string}func main() { file, e := ioutil.ReadFile("./test1.json") if e != nil { fmt.Println("file error") os.Exit(1) } var s JSONType s.FirstSet.Vals = map[string]string{} json.Unmarshal([]byte(file), &s) fmt.Printf("\nJSON: %+v\n", s)}未加载 Vals 地图。我究竟做错了什么?谢谢你的帮助!这是一个更好的例子:{ "set1": { "a": { "x": "11", "y": "22", "z": "33" }, "b": { "x": "211", "y": "222", "z": "233" }, "c": { "x": "311", "y": "322", "z": "333" }, }}代码:package mainimport ( "encoding/json" "fmt" "io/ioutil" "os")type JSONType struct { FirstSet map[string]ValsType `json:"set1"`}type ValsType struct { X string `json:"x"` Y string `json:"y"` Z string `json:"z"`}func main() { file, e := ioutil.ReadFile("./test1.json") if e != nil { fmt.Println("file error") os.Exit(1) } var s JSONType json.Unmarshal([]byte(file), &s) fmt.Printf("\nJSON: %+v\n", s)}
1 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
我相信这是因为您的模型中有额外的间接层。
type JSONType struct {
FirstSet map[string]string `json:"set1"`
}
应该够了。如果您map[string]string在 json 中指定对象被识别为该映射。你创建了一个结构来包装它,但是像这样的一团json;
{
"a":"11",
"b":"22",
"c":"33"
}
其实可以直接解组成 map[string]string
编辑:基于评论的其他一些模型
type JSONType struct {
FirstSet map[string]Point `json:"set1"`
}
type Point struct {
X string `json:"x"`
Y string `json:"y"`
Z string `json:"z"`
}
这使您的 3-d 点成为静态类型的结构,这很好。如果您想做快速而肮脏的事情,您也可以使用map[string]map[string]string which 将提供地图地图,以便您可以访问点值,例如FirstSet["a"]["x"],它会返回"11".
第二次编辑;显然我没有仔细阅读你的代码,因为上面的例子是一样的。基于此,我猜你想要
FirstSet map[string]map[string]string `json:"set1"`
选项。尽管在您编辑后我并不完全清楚。
- 1 回答
- 0 关注
- 192 浏览
添加回答
举报
0/150
提交
取消