在Go Lang中使用深度嵌套的JSON

时间:2018-07-16 20:19:31

标签: json go struct

我有一个我认为非常混乱的JSON块,我想阅读和 使用Go修改两个嵌套在其中的值(表示:我想要这个!)。 由于我要将其发送到服务器, 我不能更改标签名称。是什么让它特别困难 对我来说,父母有多个孩子也是嵌套的,并且由于有太多“价值”标签,我不知道如何指定我要输入的“价值”孩子。

使用此工具,我可以很快获得Bash中的值

jq ' .value[0].value[1].value[0].value[1].value[0].value="'"$one"'" | '\ '
.value[0].value[1].value[0].value[1].value[1].value="'"$two"'"'

我最初在Go中尝试了这种格式,但由于子项都被命名为“值”的问题而无法使用,因此我想将其与第一种除掉。不幸的是,那些不可思议的JSON to Go结构也无法处理所有嵌套。

type Bar struct {
    Value struct { // Value[0]
        Value struct {  // Value[1]
            Value struct { // Value[0]
                Value struct { // Value[1]
                    Value struct { // Value[1] or Value[2]
                    }}}}}}

此代码将JSON转换为对结构/地图更友好的形式,并打印整个内容。

var foo interface{}
err := json.Unmarshal(blob, &foo)
if err != nil {
    fmt.Println("error:", err)
}

m := foo.(map[string]interface{})

// print all
fmt.Println("Loop: ", m)
for k, v := range m {
    fmt.Printf("%v : %v", k, v)
}

这是我存储为变量的JSON

var blob = []byte(`{
"tag": "1",
"value": [{
        "tag": "2",
        "value": [{
                "tag": "3",
                "value": [{
                        "tag": "4",
                        "type": "x",
                        "value": "x"
                    }, {
                        "tag": "5",
                        "type": "x",
                        "value": "x"
                    }
                ]
            }, {
                "tag": "6",
                "value": [{
                        "tag": "7",
                        "value": [{
                                "tag": "8",
                                "type": "x",
                                "value": "x"
                            }, {
                                "tag": "9",
                                "value": [{
                                        "tag": "10",
                                        "type": "x",
                                        "value": "I want this!"
                                    }, {
                                        "tag": "11",
                                        "type": "Thanks for the help mate!",
                                        "value": "I want this!"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }, {
                "tag": "12",
                "type": "x",
                "value": "x"
            }
        ]
    }, {
        "tag": "13",
        "value": [{
                "tag": "14",
                "type": "x",
                "value": "x"
            }, {
                "tag": "15",
                "value": [{
                        "tag": "16",
                        "value": [{
                                "tag": "17",
                                "type": "x",
                                "value": "x"
                            }
                        ]
                    }
                ]
            }
        ]
    }
]
}`)

如果您能给予我任何帮助或建议,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

您最初的尝试没有用,因为您在需要切片结构(Value []struct{...})的地方使用了结构。但这也不起作用,因为在某些情况下,值是切片,在某些情况下,它们是字符串,encoding/json不喜欢。最好的选择是以下两个选项之一:原始文本操作,它可能会更快但更脆弱且容易出错,或者像第二个示例中那样解码为map[string]interface{}并执行一些粗糙的类型断言:

var foo map[string]interface{}
err := json.Unmarshal(blob, &foo)
if err != nil {
    fmt.Println("error:", err)
}

foo["value"].([]interface{})[0].(map[string]interface{})["value"].([]interface{})[1].(map[string]interface{})["value"].([]interface{})[0].(map[string]interface{})["value"].([]interface{})[1].(map[string]interface{})["value"].([]interface{})[0].(map[string]interface{})["value"]