【问题标题】:How do I extract a key with jq based on its child values如何根据子值提取带有 jq 的键
【发布时间】:2020-05-26 21:10:28
【问题描述】:

我正在尝试使用 jq 处理一些 JSON。具体来说,我想要一个特定的键,基于它的子值。示例,给定:

{
  "foo": {"primary": true, "blah": "beep"},
  "bar": {"primary": false, "blah": "narf"},
  "baz": {"primary": false, "blah": "poink"},
}

我想要字符串“foo”,因为这是子值“primary”为真的键。(由于生成 JSON 的原因,我可以保证只有一个条目具有 primary = true。)

到目前为止,我能做到的最好的是:

jq -r '.[] | select(.primary == true)'

但这会返回 "foo" 的值,而不是字符串 "foo" 本身。到目前为止,我还没有找到一种专门获取密钥的方法。

您可以提供任何指针吗?

【问题讨论】:

    标签: jq


    【解决方案1】:

    您需要将您的对象“拆分”为一组条目,例如

    [
      {
        "key": "foo",
        "value": {
          "primary": true,
          "blah": "beep"
        }
      }
      //...
    ]
    

    然后您可以使用.value.primary 过滤并使用.key 映射结果:

    to_entries | map(select(.value.primary)  | .key)
    

    返回:

    [
      "foo"
    ]
    

    或者只获取数组的第一项:(感谢@nbari)

    to_entries | map(select(.value.primary)  | .key)[0]
    

    【讨论】:

    • input | jq -r 'to_entries | map(select(.value.primary == true) | .key)[0]' 获取foo
    • == true 不是必需的;因为对于任何布尔值 foofoo == truefoo 本身具有相同的真值。
    • 谢谢两位。我采纳了你的建议。
    • 啊,to_entries 正是我所需要的。那工作得很好。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多