【问题标题】:Find an entry in a JSON list of objects based on object's key根据对象的键在对象的 JSON 列表中查找条目
【发布时间】:2019-01-15 16:08:09
【问题描述】:

我有 JSON,除了其他顶级内容外,还包括以下内容:

{
  "organizationStructure": [
    {
      "id": 212119,
      "key": "level2"
    },
    {
      "id": 212112,
      "key": "level1"
    }
  ]
}

如何通过键进行过滤以仅查找给定的 id(例如“level2”)?

【问题讨论】:

  • 请说明指定级别是否可以在输入中多次出现,以及输出应采用何种格式,考虑到所有各种可能性。

标签: arrays json select jq


【解决方案1】:

或者,为了更简单(或更复杂,取决于您的观点):

jq '.organizationalStructure[] |
    select(.key == "level1") | {id: .id}' 

通常,清理输出会很好:

jq -r '.organizationalStructure[] |
        select(.key == "level1") | {id: .id}.id'

根据 PesaThe 在 cmets 中的建议,这可以简化为:

jq -r '.organizationalStructure[] |
    select(.key == "level1").id' 

而{.id: id}可以简单写成{id}

【讨论】:

  • 为什么不只在第一个示例中使用{id} 而在第二个示例中使用select(...).id?我错过了什么?
  • 您可能没有遗漏任何东西!我发布 jq 问题的解决方案主要是为了获得对我有限的 jq 知识的反馈。感谢您的建议!
  • 我的jq知识也很有限,所以才问:)
【解决方案2】:

这可以使用select 来完成。请注意,如果键为 level2 的项目不止一个,则只会返回第一个:

.organizationalStructure | map(select(.key == "level2") | .id)[0]

【讨论】:

  • 请更正organizationalStructure 。应该是organizationStructure
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-16
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多