需要帮助使用 jq 解析 json 输出以获得复杂的 json

Need help parsing json output with jq for a complex json

对于下面的 JSON,我需要 result.id 和 result.name 使用 jq 输出

authorization.roles[].name == "Supervisor" 

jq 的命令是什么?对于下面的 json 我们期望 1231 id 和名称 AAAA 单独作为输出,因为只有主管作为角色

{
    "results": [{
        "id": "1231",
        "name": "AAAA",
        "div": {
            "id": "AAA",
            "name": "DDSAA",
            "selfUri": ""
        },
        "chat": {
            "jabberId": "nn"
        },
        "department": "Shared Services Organization",
        "email": "Test@gmail.com",
        "primaryContactInfo": [{
            "address": "Test@gmail.com",
            "mediaType": "EMAIL",
            "type": "PRIMARY"
        }],
        "addresses": [],
        "state": "active",
        "title": "AAA",
        "username": "Test@gmail.com",
        "version": 27,
        "authorization": {
            "roles": [{
                "id": "01256689-c5ed-43a5-b370-58522402830d",
                "name": "AA"
            }, {
                "id": "1e65b009-9f8f-4eef-9844-83944002c095",
                "name": "BBB"
            }, {
                "id": "8a19f1ff-40e5-45d2-b758-14550a173323",
                "name": "CCC"
            }, {
                "id": "d02250e2-7071-46bf-885b-43edff2d88a6",
                "name": "Supervisor"
            }]
        }
    }, {
        "id": "1255",
        "name": "BBBB",
        "div": {
            "id": "AAA",
            "name": "DDSAA",
            "selfUri": ""
        },
        "chat": {
            "jabberId": "nn"
        },
        "department": "Shared Services Organization",
        "email": "Test@gmail.com",
        "primaryContactInfo": [{
            "address": "Test@gmail.com",
            "mediaType": "EMAIL",
            "type": "PRIMARY"
        }],
        "addresses": [],
        "state": "active",
        "title": "AAA",
        "username": "Test@gmail.com",
        "version": 27,
        "authorization": {
            "roles": [{
                "id": "01256689-c5ed-43a5-b370-58522402830d",
                "name": "AA"
            }, {
                "id": "1e65b009-9f8f-4eef-9844-83944002c095",
                "name": "BBB"
            }, {
                "id": "8a19f1ff-40e5-45d2-b758-14550a173323",
                "name": "CCC"
            }, {
                "id": "d02250e2-7071-46bf-885b-43edff2d88a6",
                "name": "Tester"
            }]
        }
    }]
}

不要在右方括号或花括号前放置逗号(这是无效的 JSON)。您的输入应如下所示:

{
  "results": [
    {
      "id": "1231",
      "name": "AAAA",
      "div": {
        "id": "AAA",
        "name": "DDSAA",
        "selfUri": ""
      },
      "chat": {
        "jabberId": "nn"
      },
      "department": "Shared Services Organization",
      "email": "Test@gmail.com",
      "primaryContactInfo": [
        {
          "address": "Test@gmail.com",
          "mediaType": "EMAIL",
          "type": "PRIMARY"
        }
      ],
      "addresses": [],
      "state": "active",
      "title": "AAA",
      "username": "Test@gmail.com",
      "version": 27,
      "authorization": {
        "roles": [
          {
            "id": "01256689-c5ed-43a5-b370-58522402830d",
            "name": "AA"
          },
          {
            "id": "1e65b009-9f8f-4eef-9844-83944002c095",
            "name": "BBB"
          },
          {
            "id": "8a19f1ff-40e5-45d2-b758-14550a173323",
            "name": "CCC"
          },
          {
            "id": "d02250e2-7071-46bf-885b-43edff2d88a6",
            "name": "Supervisor"
          }
        ]
      }
    },
    {
      "id": "1255",
      "name": "BBBB",
      "div": {
        "id": "AAA",
        "name": "DDSAA",
        "selfUri": ""
      },
      "chat": {
        "jabberId": "nn"
      },
      "department": "Shared Services Organization",
      "email": "Test@gmail.com",
      "primaryContactInfo": [
        {
          "address": "Test@gmail.com",
          "mediaType": "EMAIL",
          "type": "PRIMARY"
        }
      ],
      "addresses": [],
      "state": "active",
      "title": "AAA",
      "username": "Test@gmail.com",
      "version": 27,
      "authorization": {
        "roles": [
          {
            "id": "01256689-c5ed-43a5-b370-58522402830d",
            "name": "AA"
          },
          {
            "id": "1e65b009-9f8f-4eef-9844-83944002c095",
            "name": "BBB"
          },
          {
            "id": "8a19f1ff-40e5-45d2-b758-14550a173323",
            "name": "CCC"
          },
          {
            "id": "d02250e2-7071-46bf-885b-43edff2d88a6",
            "name": "Tester"
          }
        ]
      }
    }
  ]
}

然后,您可以使用select来缩小您的目标对象(这里使用any来检查是否至少有一个角色名称与您的字符串匹配——thx @ikegami),然后输出结果对象的任何部分:

jq '
  .results[]
  | select(any(.authorization.roles[]; .name == "Supervisor"))
  | {id, name}
'
{
  "id": "1231",
  "name": "AAAA"
}

Demo

如果您需要原始文本而不是 JSON 输出,请使用 -r(或 --raw-output)标志,并提供您感兴趣的字段:

jq -r '
  .results[]
  | select(any(.authorization.roles[]; .name == "Supervisor"))
  | .id, .name
'
1231
AAAA

Demo