我无法弄清楚如何加载"小节"将JSON文件放入地图元素中。背景:我试图解组一个有点复杂的配置文件,它有一个严格的结构,所以我认为它最好解组为静态"结构而不是接口{}。
这是一个简单的JSON文件,例如:
{
"set1": {
"a":"11",
"b":"22",
"c":"33"
}
}
此代码有效:
package main
import (
"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 main
import (
"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 main
import (
"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)
}
答案 0 :(得分:3)
我相信这是因为你的模型中有额外的间接层。
type JSONType struct {
FirstSet map[string]string `json:"set1"`
}
应该足够了。如果指定map[string]string
,则json中的对象将被识别为该地图。你创建了一个结构来包装它,但是像这样的一个json blob;
{
"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
这将提供地图地图,以便您可以访问FirstSet["a"]["x"]
之类的点值,并返回"11"
。
第二次编辑;显然我没有仔细阅读你的代码,因为上面的例子是相同的。基于此我猜你想要
FirstSet map[string]map[string]string `json:"set1"`
选项。虽然在编辑后我并不完全清楚。