【问题标题】:How to use JQ to filter an object based on a value, and return an array of different values?如何使用JQ根据一个值过滤一个对象,并返回一个不同值的数组?
【发布时间】:2020-07-09 16:21:37
【问题描述】:

我有一个返回大量对象数组的调用。

对象看起来像:

{
  "accounts": [
    {
      "id": 1234,
      "name": "Sample Name",
      "status": "upgraded",
      "subscription": {
        "id": 4567,
        "products": [
          {
            "product_id": 5,
            "name": "Awesome Product",
            "units": 1,
            "price": 1
          },
          {
            "product_id": 1,
            "name": "Another Awesome Product",
            "units": 1,
            "price": 1
          }
        ]
      },
      "owner": {
        "id": 12345,
        "email": "email@email.com",
        "first_name": "John",
        "last_name": "Doe",
        "state": "active"
      }
    }
  ]
}

在这个数组中,有很多不同的对象,有很多不同的所有者,我想返回一个只包含id(对象的第一个属性)如果所有者的数组em> 属性是 12345。

目前为止

| jq -r '.accounts[] | [.id]'

它返回对象中的所有“id”,但我无法根据“所有者”值过滤此数组

我已经尝试添加:

| jq -r '.accounts[] | [.id] | select(.id == 12345)'

但我目前遇到了错误

Cannot index array with string "id"

【问题讨论】:

  • 抱歉,accounts 是 root 密钥 - 我发布的所有内容都在 accounts 密钥中

标签: arrays json jq


【解决方案1】:

你很亲密。选择 ownerid12345accounts,并提取他们的(account's,而不是owner's) ids,你可以用这个:

$ jq '.accounts | map(select(.owner.id == 12345) .id)' file
[
  1234
]

【讨论】:

    【解决方案2】:

    另一种选择是

    .accounts[]| select(.owner.id == 12345).id 
    

    哪个输出:

    1234
    

    【讨论】:

    • OP 需要一个数组作为输出。
    猜你喜欢
    • 2022-07-22
    • 1970-01-01
    • 2022-06-22
    • 2018-08-27
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多