感谢@peak和linked question我已经开始理解jq了,但我正在努力解决如何在bash中捕获输出到vars的基础知识。审查jq手册还没有解决问题
鉴于下面的json,我想使用walk来捕获嵌套键的值。在执行之前结构是未知的,因此不可能进行标准查询,并且所需的键可以是从0到20的任意嵌套级别。
示例json
{
"zzz": [{
"id": "aaa",
"des": "object A",
"parent": "zzz",
"children": {
"aaa": [{
"id": "bbb",
"des": "object B",
"parent": "aaa",
"children": {
"bbb": [{
"id": "ccc",
"des": "object C",
"parent": "bbb",
"children": {
"ccc": [{
"id": "ddd", <===this is the value I need
"des": "object d",
"parent": "ccc"
}]
}
}, {
"id": "eee",
"des": "object e",
"parent": "bbb"
}]
}
},{
"id": "fff",
"des": "object f",
"parent": "aaa"
}]
}
}]}
现在使用walk
功能我可以找到我想要的密钥
myId=$(jq 'walk(when(type == "object";
with_entries(
when(.key|test("ccc");
when(any(.value[]; .parent == "ccc");
...insert action-code here....
)))))' <<< ${json})
如果我使用上面的walk
代码并拥有类似.value[] += {"myKey": "myVal"}
的操作代码,则会将其添加到所选对象。
现在我想要捕获id
的值,而不是添加到对象中。所以我虽然它可能是一个简单的字符串,也可能是一个select语句,但它们不起作用。
动作代码
select(.parent == "ccc")|.hrn|.value
or
.hrn.value
or
.value[].hrn?
加上很多其他组合。捕获id
值的正确语法是什么?
答案 0 :(得分:1)
对于此类问题,您可以使用..
。将您的数据作为输入,使用以下过滤器:
..
| objects
| to_entries[]
| select(.key|test("ccc"))
| .value[]
| select(.parent=="ccc")
| .id
产生
"ddd"