说我有以下JSON,存储在我的变量 jsonVariable 中。
{
"id": 1,
"details": {
"username": "jamesbrown",
"name": "James Brown"
}
}
我使用以下代码使用jq解析此JSON:
echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'
这会给我输出
James Brown
但是,如果我想得到这个人的身份怎么办?现在,我知道这是一个粗略而简单的例子 - 我正在使用的程序是5或6级深度,除了select之外还有许多不同的JQ函数。在执行各种过滤方法后,当我已经深入5或6层时,我需要一种方法来选择父项的字段。
有人可以帮忙吗?是否有任何“反向”的方式,回到父母身边? (不确定我是否有意义!)
答案 0 :(得分:33)
对于更通用的方法,请保存" parent"的值。您想要的详细级别的元素,然后在过滤器的末尾管道:
jq '. as $parent | .details.name | select(. == "James Brown") | $parent'
当然,对于你揭露的琐碎案例,你可以完全省略:
jq 'select(.details.name == "James Brown")'
另外,请考虑如果您选择的过滤器为单个父对象返回许多匹配项,您将收到每个匹配项的父对象的副本。您可能希望确保您的选择过滤器仅通过将父级别下的所有匹配包装到数组中而在父级别返回一个元素,或者使用unique
对最终结果进行重复数据删除。
答案 1 :(得分:1)
试一试:
echo $jsonVariable | jq '{Name: .details.name, Id: .Id} | select(.name == "James Brown")'
答案 2 :(得分:1)
不要查询您正在测试的值,而是查询包含您要查询的值的根对象以及您希望选择的值。
您需要包含id
和name
。
$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json