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

问题描述 投票:0回答:1

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

json bash jq
1个回答
1
投票

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

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

生产:

"ddd"
© www.soinside.com 2019 - 2024. All rights reserved.