получить объекты, которые соответствуют значению ключа из вложенного объекта, который цитируется - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть список объектов JSON с этим форматом

[
 {
    "uuid": "2e08c71c-56af-4c1d-9677-0aad7bf38536",
    "name": "img-s3",
    "summary": "",
    "retention_name": "month",
    "retention_uuid": "beae2f1a-10e9-4b53-b9b1-baf823624ff2",
    "expiry": 2678400,
    "schedule_name": "daily",
    "schedule_uuid": "baca1a64-b506-4789-83c8-653573f2b99f",
    "schedule_when": "daily 2am",
    "paused": false,
    "store_uuid": "d91fd7b6-4c39-4f73-aa44-8ec55f52da65",
    "store_name": "default",
    "store_plugin": "s3v8",
    "store_endpoint": "{\"access_key_id\":\"xxxx\",\"bucket\":\"images-c4\",\"s3_host\":\"s3.amazon.com\",\"secret_access_key\":\"yyy\",\"signature_version\":\"2\",\"skip_ssl_validation\":true}",
    "target_uuid": "991c7aa2-cdd3-4f90-bb28-1431c99f8fc8",
    "target_name": "sc-asd",
    "target_plugin": "mysql",
    "target_endpoint": "{\"mysql_database\":\"users\",\"mysql_host\":\"10.10.22.49\",\"mysql_password\":\"password\",\"mysql_port\":\"3306\",\"mysql_user\":\"user\"}",
    "agent": "127.0.0.1:3030"
}
...
]

Мне нужно получить только объекты, использующие storege_plugin: "s3v8", и что в объекте значения "quoted" storage_endpoint ключ signature_version равен 2

Чтобы найти объект, имеющий storage_plugin: "s3v8" и store_endpoing != null Я использую это:

$ command | jq '.[] | select(.store_plugin == "s3v8" and .store_endpoint != null)'

Но проблема, с которой я столкнулся сейчас, заключается в том, что значение store_endpoint заключено в кавычки, и мне нужно получать результаты только на основе значения ключа, в данном случае signature_value

Чтобы проверить, как заключить в кавычки и найти значение, я пытаюсь это:

$ echo "{\"access_key_id\":\"xxxx\",\"bucket\":\"images-c4\",\"s3_host\":\"s3.amazon.com\",\"secret_access_key\":\"yyy\",\"signature_version\":\"2\",\"skip_ssl_validation\":true}" \
| jq -r 'select(.signature_version == "2")'
{
  "access_key_id": "xxxx",
  "bucket": "images-c4",
  "s3_host": "s3.amazon.com",
  "secret_access_key": "yyy",
  "signature_version": "2",
  "skip_ssl_validation": true
}

Но хотелось бы знать, как можно «объединить» эти параметры, чтобы я мог получить список объектов, которые имеют набор требуемых ключей, но это зависит от вложенного ключа, хранящегося в указанном объекте.

1 Ответ

0 голосов
/ 07 сентября 2018

Вам необходимо использовать конструкцию fromjson для вложенного поля JSON, как показано ниже. fromjson - это , а не , что хорошо документировано в официальной документации, но позволяет анализировать тексты JSON в значения для использования в фильтрах.

.[] | select((.store_plugin == "s3v8" and .store_endpoint != null) and (.store_endpoint | fromjson | .signature_version == "2") )

jqplay.org - URL

...