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)
...然后提取所有剩余键的值以及尾随的[].