猿问

在 Go 中将 JSON 解组为地图

我无法弄清楚如何将 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)

}


料青山看我应如是
浏览 193回答 1
1回答

摇曳的蔷薇

我相信这是因为您的模型中有额外的间接层。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"`选项。尽管在您编辑后我并不完全清楚。
随时随地看视频慕课网APP

相关分类

Go
我要回答