使用JQ过滤不同层级的JSON数据

Using JQ to filter JSON data at different levels

我有这个 JSON 数据:some-json-file 其中包含以下内容

{
  "result": [
    {
      "id": "1234567812345678",
      "name": "somewebsite.com",
      "status": "active",
      "type": "secondary",
      "activated_on": "2021-12-12T15:44:40.444433Z",
      "plan": {
        "id": "77777777777777777777777777",
        "name": "Enterprise Website",
        "is_subscribed": true,
        "legacy_id": "enterprise",
        "externally_managed": true
      }
    }
  ],
  "result_info": {
    "page": 1,
    "total_pages": 1
  },
  "success": true,
  "messages": []
}

我正在尝试使用 jq

从中获取过滤后的输出
{
  "name": "somewebsite.com",
  "type": "secondary",
  "plan": {
    "name": "Enterprise Website",
    "id": "77777777777777777777777777"
  }
}

但我不知道该怎么做。

我可以这样过滤第一层标签

cat some-json-file | jq '.result[] | {name,type,plan}'

这让我得到这个输出

{
  "name": "somewebsite.com",
  "type": "secondary",
  "plan": {
    "id": "77777777777777777777777777",
    "name": "Enterprise Website",
    "is_subscribed": true,
    "legacy_id": "enterprise",
    "externally_managed": true
  }
}

这让我很接近,但我无法进一步过滤 .plan 下的子标签,因此我只能看到 .name.id.

有什么想法吗?谢谢!

你快到了。只需设置新上下文并再次使用相同的技术:

jq '.result[] | {name,type,plan: .plan | {name,id}}' some-json-file
{
  "name": "somewebsite.com",
  "type": "secondary",
  "plan": {
    "name": "Enterprise Website",
    "id": "77777777777777777777777777"
  }
}

Demo

注意:您不需要cat输入,jq接受文件名作为参数。