如果字段值为“auto”,则选择键

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)

Kus*_*nda 5

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)

...然后提取所有剩余键的值以及尾随的[].