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

jq - How do I print a parent value of an object when I am already deep into the object's children?

假设我有以下 JSON,存储在我的变量 jsonVariable.

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

我用 jq 解析这个 JSON 使用以下内容:

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

这会给我输出

詹姆斯·布朗

但是如果我也想得到这个人的id呢?现在,我知道这是一个粗略而简单的例子——我目前正在使用的程序有 5 或 6 层深,除了 select 之外还有许多不同的 JQ 函数。在执行各种过滤方法后,当我已经有 5 或 6 层深度时,我需要一种方法 select 父字段。

有人能帮忙吗? 'going in reverse' 有什么办法可以备份到父级吗? (不确定我说的有没有道理!)

试一试:

echo $jsonVariable | jq '{Name: .details.name, Id: .Id}  | select(.name == "James Brown")'

与其查询您正在测试的值,不如查询包含您正在查询的值和您希望的值的根对象 select。

您需要包含 idname 的对象。

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json

对于更通用的方法,请将 "parent" 元素的值保存在您想要的详细级别,然后将其通过管道传递到过滤器的末尾:

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

当然,对于您公开的微不足道的案例,您可以完全省略:

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

此外,请考虑如果您的 selecting 过滤 return 单个父对象的多个匹配项,您将收到每个匹配项的父对象的副本。您可能希望通过将父级以下的所有匹配项包装到一个数组中来确保您的 select 仅过滤 return 父级的一个元素,或者使用 unique 对最终结果进行重复数据删除。