JQ Выбор внешних объектов и дочерних объектов на основе дочерних - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь выбрать объект учетных данных и конкретные объекты родительского уровня, только если ключ 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.

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Это один из многих способов получить ожидаемый результат:

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"
  }
}
0 голосов
/ 02 апреля 2019

альтернативно, ваш запрос может быть выполнен с помощью jtc утилита unix:

bash $ <file.json jtc -x'<credentials>l:[credhub-ref][-2]' -y[credentials] -y[app_guid] -y[service_instance_guid] -lj
[
   {
      "app_guid": "9c",
      "credentials": {
         "credhub-ref": "/c/54"
      },
      "service_instance_guid": "66"
   },
   {
      "app_guid": "73",
      "credentials": {
         "credhub-ref": "/c/54"
      },
      "service_instance_guid": "ae"
   }
]
bash $ 

Общая (общая) разбивка дорожки (-x):

  • <credentials>l: - найти все записи JSON с меткой credentials
  • [credhub-ref] в каждой найденной записи выберите запись credhub-ref (если такой записи не существует, такой экземпляр поиска прерывается и затем повторяется)
  • [-2] - из последней успешно выбранной записи увеличьте на 2 родителя в дереве JSON

- это выберет каждую запись в ресурсах.

Затем для каждого указанного отдельного пути (-y) происходит обход выбранной записи, давая вам желаемый результат

options -lj просто обеспечить правильную группировку полученных прогулок

...