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

在 Go 中将 JSON 解组为地图

在 Go 中将 JSON 解组为地图

Go
料青山看我应如是 2021-10-18 10:20:25
我无法弄清楚如何将 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"`

选项。尽管在您编辑后我并不完全清楚。


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

添加回答

举报

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