我正在尝试用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对象。
有人可以帮忙吗?如果我不够清楚,请告诉我!
答案 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