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