将JSON解组到Go中的地图中

时间:2015-06-16 17:29:05

标签: json dictionary go

我无法弄清楚如何加载"小节"将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)
}

1 个答案:

答案 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"`

选项。虽然在编辑后我并不完全清楚。