繁体   English   中英

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")'

这会给我输出

詹姆斯布朗

但是如果我想得到这个人的身份怎么办? 现在,我知道这是一个粗略而简单的例子 - 我正在使用的程序是5或6级深度,除了select之外还有许多不同的JQ函数。 在执行各种过滤方法后,当我已经深入5或6层时,我需要一种方法来选择父项的字段。

有人可以帮忙吗? 是否有任何“反向”的方式,回到父母身边? (不确定我是否有意义!)

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

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

当然,对于你揭露的琐碎案例,你可以完全省略:

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

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

试一试:

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

您可以查询包含您要查询的值的根对象以及您要选择的值,而不是查询您正在测试的值。

您需要包含idname的对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM