jq将嵌套键的值保存到var中

时间:2018-03-06 20:10:34

标签: json bash jq

感谢@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值的正确语法是什么?

1 个答案:

答案 0 :(得分:1)

对于此类问题,您可以使用..。将您的数据作为输入,使用以下过滤器:

..
| objects
| to_entries[]
| select(.key|test("ccc"))
| .value[]
| select(.parent=="ccc")
| .id

产生

"ddd"