如何使用 jq 在 JSON 对象中查找值符合给定条件的所有路径?
How can I use jq to find all paths in a JSON object under which a value matches a given criteria?
有没有一种方法可以使用 jq 来查找包含符合给定条件的值的所有路径?
例如,给定以下 JSON,我想 return 所有 "age" 的值大于 35 的路径,而不管包含的结构的深度如何该字段:
{
"springfield":{
"marge":{
"age":30
},
"homer":{
"age":40,
"job":"xyz"
}
},
"shelbyville":{
"zone1":{
"john":{
"age":10
}
},
"zone2":{
"mark":{
"age":50
}
}
},
"homeless1":{
"age":25
},
"homeless2":{
"age":60
}
}
所以执行会产生如下结果:
[
["springfield", "homer"],
["shelbyville", "zone2", "mark"],
["homeless2"]
]
以下已使用 jq 1.4 和 jq 1.5 进行测试:
$ jq -M -c '(paths | select(.[length-1] =="age")) as $path
| if (getpath($path) > 35) then $path else empty end' ages.json
["springfield","homer","age"]
["shelbyville","zone2","mark","age"]
["homeless2","age"]
以下需要 jq 1.5:
$ jq -c --stream 'select(length == 2 and .[0][-1] == "age"
and .[1] > 35)' ages.json
[["springfield","homer","age"],40]
[["shelbyville","zone2","mark","age"],50]
[["homeless2","age"],60]
这些都可以很容易地适应以产生类似的输出。
这应该可以解决问题:
[paths(.age?>35)]
有没有一种方法可以使用 jq 来查找包含符合给定条件的值的所有路径?
例如,给定以下 JSON,我想 return 所有 "age" 的值大于 35 的路径,而不管包含的结构的深度如何该字段:
{
"springfield":{
"marge":{
"age":30
},
"homer":{
"age":40,
"job":"xyz"
}
},
"shelbyville":{
"zone1":{
"john":{
"age":10
}
},
"zone2":{
"mark":{
"age":50
}
}
},
"homeless1":{
"age":25
},
"homeless2":{
"age":60
}
}
所以执行会产生如下结果:
[
["springfield", "homer"],
["shelbyville", "zone2", "mark"],
["homeless2"]
]
以下已使用 jq 1.4 和 jq 1.5 进行测试:
$ jq -M -c '(paths | select(.[length-1] =="age")) as $path
| if (getpath($path) > 35) then $path else empty end' ages.json
["springfield","homer","age"]
["shelbyville","zone2","mark","age"]
["homeless2","age"]
以下需要 jq 1.5:
$ jq -c --stream 'select(length == 2 and .[0][-1] == "age"
and .[1] > 35)' ages.json
[["springfield","homer","age"],40]
[["shelbyville","zone2","mark","age"],50]
[["homeless2","age"],60]
这些都可以很容易地适应以产生类似的输出。
这应该可以解决问题:
[paths(.age?>35)]