在golang中动态创建嵌套地图

时间:2019-01-26 13:19:32

标签: json go

我正在尝试用Golang解释JSON。我正在未知的JSON中搜索特定属性,我知道其键,但是我的JSON可能确实是嵌套的。我确实知道JSON中有多少个“层”。

例如,如果我的JSON是:

nestedJson = { key1: { key2: { key3: "Found data" } } } 

我的键是[“ key1”,“ key2”,“ key3”],此JSON中包含3层,因此我可以通过这样做来取回数据

var nestedJson = []map[string]map[string]map[string]interface{}
json.Unmarshal([]byte(nestedJon), &nestedJson)
data := nestedJson["key1]["key2"]["key3"]

我想做的是通过搜索应指定层数的整数值来动态创建nestedJson对象。

有人可以帮忙吗?如果我不够清楚,请告诉我!

2 个答案:

答案 0 :(得分:3)

通常,对于这种情况,您必须将documentFile的通用解编组能力转换为json.Unmarshal

interface{}

现在您可以使用一堆类型断言来探索b := []byte(`{ "key1": { "key2": { "key3": "Found data" } } } `) var f interface{} if err := json.Unmarshal(b, &f); err != nil { panic(err) } fmt.Println(f) ,例如查找其中包含的键:

f

如果在此级别上找不到key3,请使用递归检查所有值-它们是否是带有key3键的地图,依此类推...类似

m := f.(map[string]interface{})
for k, v := range m {
    if k == "key3" {
        fmt.Println("found key3. maps to", v)
    }
}

注意:此功能很快被一起使用,可能会处理很多极端情况。在这里展示关键思想-将其用作您特定需求的基础

答案 1 :(得分:0)

我个人喜欢使用 gabs 模块,它允许以更人性化的方式处理此类情况。


安装模块使用:

go get github.com/Jeffail/gabs/v2

方便的用法示例

// jsonParsed var contains a set of functions to play arround
jsonParsed, _ := gabs.ParseJSON([]byte(`{
    "outter":{
        "inner":{
            "value1":10,
            "value2":22
        },
        "alsoInner":{
            "value1":20,
            "array1":[
                30, 40
            ]
        }
    }
}`))

// for your case, it's useful Exists or ExistsP functions
exists := jsonParsed.Exists("outter", "inner", "value1")
// exists == true

exists = jsonParsed.ExistsP("outter.inner.value3")
// exists == false

由于您需要一些动态键搜索,您可以使用 ChildrenMap 函数通过前面解释的函数来迭代和验证键的存在。

jsonParsed, err := gabs.ParseJSON([]byte(`{"object":{"first":1,"second":2,"third":3}}`))
if err != nil {
    panic(err)
}

// S is shorthand for Search
for key, child := range jsonParsed.S("object").ChildrenMap() {
    fmt.Printf("key: %v, value: %v\n", key, child.Data().(float64))
    // here you can use Exists or ExistsP
}
// key: first, value: 1
// key: second, value: 2
// key: third, value: 3