一尘不染

jq-当我已经深入对象的子级时,如何打印该对象的父级值?

json

说我有以下JSON,存储在我的变量 jsonVariable中

{
    "id": 1,
    "details": {
        "username": "jamesbrown",
        "name": "James Brown"
    }
}

我使用以下命令通过jq解析此JSON:

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'

这会给我输出

詹姆斯·布朗

但是,如果我也想获得此人的身份证怎么办?现在,我知道这是一个粗糙且简单的示例-
目前正在使用的程序深度为5或6级,除了select以外还具有许多其他JQ函数。在执行各种过滤方法之后,当我已经深达5或6层时,我需要一种选择父母字段的方法。

有人可以帮忙吗?有什么办法可以“逆转”,回到父母身边吗?(不确定我是否有意义!)


阅读 209

收藏
2020-07-27

共1个答案

一尘不染

对于更通用的方法,将“父”元素的值保存在所需的详细信息级别,然后将其通过管道传递到过滤器的末尾:

jq '. as $parent | .details.name | select(. == "James Brown") | $parent'

当然,对于您暴露的琐碎情况,您可以完全省略以下内容:

jq 'select(.details.name == "James Brown")'

另外,请考虑,如果您选择的过滤器为单个父对象返回了许多匹配项,则您将为每个匹配项收到一个父对象的副本。您可能希望通过将父级以下的所有匹配项包装到一个数组中,或使用来对最终结果进行重复数据删除,以确保您的选择过滤器仅在父级返回一个元素unique

2020-07-27