我有一个正在尝试解析的 JSON 文件。如果字段的值为 ,我想选择键值auto
。我应该得到输出为package2
.我用来在 shelljq
中解析 JSON bash
。
{
"package1":{
"name":"package_1",
"value":"manual"
},
"package2":{
"name":"package_2",
"value":"auto"
}
}
答案1
和
jq 'map_values(select(.value == "auto"))' file
...您提取您感兴趣的顶级对象的部分:
{
"package2": {
"name": "package_2",
"value": "auto"
}
}
使用map_values(expression)
,您可以应用于expression
输入对象的每个子部分。在这种情况下,该部分是保留如果语句中的测试select()
评估为真的,否则丢弃。它类似于map(expression)
,但您可以map()
在数组和map_values()
对象上使用。
从那里,您可以选择获取顶级密钥:
$ jq -r 'map_values(select(.value == "auto"))|keys[]' file
package2
该keys
函数创建输入对象中所有键的数组,最后[]
将数组扩展为一组字符串。
请注意,如果有多个子对象作为auto
其.value
键值,您将从该命令中获得多个字符串。
有那么一会儿,我不确定您是想要密钥的值.name
还是顶级密钥。当我发现你只想要顶级密钥时,我已经写了下面的文字。我将其作为一种评论保留下来。
$ jq -r 'map_values(select(.value == "auto"))[].name' file
package_2
最后使用[].name
,将顶级对象扩展为一组子对象,然后.name
从每个子对象中提取键的值。
最后一个也可以写成
$ jq -r 'map_values(select(.value == "auto").name)[]' file
package_2
...这将原始对象减少到仅
{
"package2": "package_2"
}
...然后提取带有尾随的所有剩余键的值[]
。