JQ фильтр JSON массив на основе значения в списке - PullRequest
0 голосов
/ 01 мая 2020

Я хочу использовать jq для возврата значения RuleArn, если следующее условие соответствует, т. Е. .[].Conditions[].Values[] имеет элемент, который соответствует app.fantastic.com

Мой JSON массив:

[
    {
        "Conditions": [
            {
                "Field": "http-header",
                "HttpHeaderConfig": {
                    "Values": [
                        "dark"
                    ],
                    "HttpHeaderName": "Environment"
                }
            },
            {
                "Values": [
                    "app.fantastic.com"
                ],
                "Field": "host-header",
                "HostHeaderConfig": {
                    "Values": [
                        "app.fantastic.com"
                    ]
                }
            }
        ],
        "IsDefault": false,
        "Priority": "3",
        "RuleArn": "iwantthisvalue"
    }
]

Я пробовал это:

| jq -r '.[] | select(.Conditions[].Values[]=="app.fantastic.com")'

и

| jq -r '.[] | select(.Conditions[].Values[] | has("app.fantastic.com"))'

Я получаю следующую ошибку:

jq: ошибка (при: 144): невозможно индексировать массив с помощью строки «Условия»

И с этим:

| jq '.[].Conditions[].Values | index ("app.fantastic.com") == 0 | .RuleArn'

Это ошибка, которую я получаю:

jq: ошибка (при: 47): невозможно индексировать логическое значение со строкой "RuleArn"

Примечание: Мне не нужно решение, использующее --query из AWS cli, поскольку я уже использую --query, чтобы получить меньшую полезную нагрузку JSON, которую я хочу отфильтровать, используя jq.

1 Ответ

1 голос
/ 01 мая 2020

Сложность, с которой вы столкнулись root, заключается в том, что постановка задачи неверна: .[].Conditions[].Values[] не соответствует вашему JSON.

Используя jq 1.5 или более позднюю версию, вы можете использовать следующий фильтр:

.[]
| first(select(.Conditions | .. | objects
               | select(has("Values") and 
                        (.Values|index("app.fantastic.com")))))
| .RuleArn

Так как. Значения встречаются в нескольких местах, неясно, каковы точные требования, но вы также можете рассмотреть sh:

.[]
| select(.Conditions[].Values? | index("app.fantastic.com"))
| .RuleArn

или (менее эффективно, но работает с jq 1.4 или новее):

.[]
| select(.Conditions[].Values[]? == "app.fantastic.com")
| .RuleArn
...