首页 > 解决方案 > JQ 根据 Child 选择外部对象和 Child

问题描述

仅当密钥 credhub-ref 存在于 JSON 之后的凭证对象中时,我才尝试选择凭证对象和特定的父级对象:

{
   "total_results": 23,
   "total_pages": 1,
   "prev_url": null,
   "next_url": null,
   "resources": [
      {
         "metadata": {
            "guid": "cd",
            "url": "/v2/service_bindings/cd",
            "created_at": "2019-03-04T21:18:53Z",
            "updated_at": "2019-03-04T21:18:53Z"
         },
         "entity": {
            "app_guid": "9c",
            "service_instance_guid": "66",
            "credentials": {
               "credhub-ref": "/c/54"
            },
            "binding_options": {},
            "gateway_data": null,
            "gateway_name": "",
            "syslog_drain_url": null,
            "volume_mounts": [],
            "name": null,
            "last_operation": {
               "type": "create",
               "state": "succeeded",
               "description": "",
               "updated_at": "2019-03-04T21:18:53Z",
               "created_at": "2019-03-04T21:18:53Z"
            },
            "app_url": "/v2/apps/9c",
            "service_instance_url": "/v2/service_instances/66",
            "service_binding_parameters_url": "/v2/service_bindings/cd"
         }
      },
      {
         "metadata": {
            "guid": "cd",
            "url": "/v2/service_bindings/cd",
            "created_at": "2019-03-11T08:49:22Z",
            "updated_at": "2019-03-11T08:49:22Z"
         },
         "entity": {
            "app_guid": "ea",
            "service_instance_guid": "86",
            "credentials": {},
            "binding_options": {},
            "gateway_data": null,
            "gateway_name": "",
            "syslog_drain_url": null,
            "volume_mounts": [],
            "name": null,
            "last_operation": {
               "type": "create",
               "state": "succeeded",
               "description": "",
               "updated_at": "2019-03-11T08:49:22Z",
               "created_at": "2019-03-11T08:49:22Z"
            },
            "app_url": "/v2/apps/ea",
            "service_instance_url": "/v2/service_instances/86",
            "service_binding_parameters_url": "/v2/service_bindings/cd"
         }
      },
      {
         "metadata": {
            "guid": "e0",
            "url": "/v2/service_bindings/e0",
            "created_at": "2019-03-19T20:07:25Z",
            "updated_at": "2019-03-19T20:07:25Z"
         },
         "entity": {
            "app_guid": "73",
            "service_instance_guid": "52",
            "credentials": {
               "hostname": "10.13.7.64",
               "port": 3306,
               "name": "cf_52",
               "username": "w",
               "password": "w",
               "uri": "mysql://",
               "jdbcUrl": "jdbc:mysql://10.193.78.64:"
            },
            "binding_options": {},
            "gateway_data": null,
            "gateway_name": "",
            "syslog_drain_url": null,
            "volume_mounts": [],
            "name": null,
            "last_operation": {
               "type": "create",
               "state": "succeeded",
               "description": "",
               "updated_at": "2019-03-19T20:07:25Z",
               "created_at": "2019-03-19T20:07:25Z"
            },
            "app_url": "/v2/apps/73",
            "service_instance_url": "/v2/service_instances/52",
            "service_binding_parameters_url": "/v2/service_bindings/e0"
         }
      },
      {
         "metadata": {
            "guid": "18",
            "url": "/v2/service_bindings/18",
            "created_at": "2019-03-19T20:07:27Z",
            "updated_at": "2019-03-19T20:07:27Z"
         },
         "entity": {
            "app_guid": "73",
            "service_instance_guid": "ae",
            "credentials": {
               "credhub-ref": "/c/54"
            },
            "binding_options": {},
            "gateway_data": null,
            "gateway_name": "",
            "syslog_drain_url": null,
            "volume_mounts": [],
            "name": null,
            "last_operation": {
               "type": "create",
               "state": "succeeded",
               "description": "",
               "updated_at": "2019-03-19T20:07:27Z",
               "created_at": "2019-03-19T20:07:27Z"
            },
            "app_url": "/v2/apps/73",
            "service_instance_url": "/v2/service_instances/aec",
            "service_binding_parameters_url": "/v2/service_bindings/18"
         }
      }
   ]
}

当前查询仅返回凭证对象:

jq '.resources[].entity.credentials | select(.["credhub-ref"])' test.json

结果是:

{
  "credhub-ref": "/c/42"
}
{
  "credhub-ref": "/c/54"
}

我需要一个输出父对象的查询,app_guid如下service_instance_guid所示:

}
   "app_guid": "9c",
   "service_instance_guid": "66",
   "credentials": {
      "credhub-ref": "/c/54"
},
{
   "app_guid": "73",
   "service_instance_guid": "ae",
   "credentials": {
      "credhub-ref": "/c/54"
}

几个很好的例子可以帮助我更好地理解 JQ 是如何工作的。

标签: jsonobjectfilterparent-childjq

解决方案


这是获得预期输出的多种方法之一:

jq '.resources[].entity | select(.credentials."credhub-ref") | {app_guid, service_instance_guid, credentials}' test.json

它将.credentials.credhub-ref在每个对象中搜索,如果找到entity,将作为对象返回。app_guid, service_instance_guid, credentials

输出:

{
  "app_guid": "9c",
  "service_instance_guid": "66",
  "credentials": {
    "credhub-ref": "/c/54"
  }
}
{
  "app_guid": "73",
  "service_instance_guid": "ae",
  "credentials": {
    "credhub-ref": "/c/54"
  }
}

推荐阅读