嵌套的json解组与2d切片到struct不在golang中工作

时间:2016-05-28 12:41:31

标签: json multidimensional-array go struct unmarshalling

我有一个看起来像

的json结构
{
"devices": [
    {
        "server": {
            "bu": {
                "add_info": false,
                "applications": [
                    [
                        "Systems",
                        12
                    ],
                    [
                        "SomeProject",
                        106
                    ]
                ],
                "name": [
                    [
                        "SomeName",
                        4
                    ],
                    [
                        "CommonName",
                        57
                    ]
                ],
                "owners": [
                    "SomeOwner1",
                    "SomeOwner2"
                ],
                "users": [
                    "SomeUser1",
                    "SomeUser2"
                ]
            }
        }
    }
  ]
}

我试图将它添加到结构中,结构看起来像

type TwoD [][]string
type MainContainer struct {
    Devices []struct{
        Server struct{
            Bu struct{
                Add_info string `json:"add_info"`
                Applications TwoD `json:"applications"`
                Name TwoD `json:"name"`
                Owners []string `json:"owners"`
                Users []string `json:"users"`
               } `json:"bu"`
               } `json:"server"`
    } `json:"devices"`
}

然而,当我打印结构时,我从2D切片中只得到一个值而没有超出它。

func main() {
jsonfile, err  := ioutil.ReadFile("./search.json")
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
var jsonobject MainContainer
json.Unmarshal(jsonfile, &jsonobject)
fmt.Printf("%v", jsonobject)
}

{[{{{ [[Systems ]] [] [] []}}}]}

但是,如果我省略结构中的2d切片,如

type MainContainer struct {
Devices []struct{
        Server struct{
            Bu struct{
                Add_info string `json:"add_info"`
                //Applications TwoD `json:"applications"`
                //Name TwoD `json:"name"`
                Owners []string `json:"owners"`
                Users []string `json:"users"`
               } `json:"bu"`
               } `json:"server"`
    } `json:"devices"`
}

所有内容都打印为

{[{{{ [SomeOwner1 SomeOwner2] [SomeUser1 SomeUser2]}}}]}

有人可以帮我辨别这里有什么问题吗?

Here是带有struct和sample json的golang游乐场的链接。这两个TwoD切片在结构中进行了注释。

注意::编辑了一个未注释的2d切片的playground链接,以便记录差异,并将类型字符串更改为bool,如@cnicutar所指出的,谢谢。

1 个答案:

答案 0 :(得分:2)

主要问题是您没有处理json.Unmarshal返回的错误。一旦处理完毕,json(和解码结构)的问题就变得很明显了。

if err := json.Unmarshal(jsonfile, &jsonobject); err != nil {
    fmt.Printf("Unmarshal: %v\n", err)
}

首先:

  

Unmarshal json:无法将bool解组为String类型的Go值

因此Add_info应为bool。修复后,取消注释Applications

  

Unmarshal json:无法将数字解组为字符串

的Go值

将12更改为“12”并将106更改为“106”后,结果为:

{[{{{false [[Systems 12] [SomeProject 106]] [SomeUser1 SomeUser2]}}}]}