Jq: Как выбрать объект, если объект имеет массив объектов, у которых есть ключ со значением, которое не совпадает?

#json #jq

#json #jq

Вопрос:

У меня есть этот объект JSON, который я хочу извлечь с помощью Jq:

 {
"key_1": "uo2",
"key_2": false,
"measurements": [
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_P"
    },
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_3"
    },
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_001"
    }
],
"key_3": "bwr",
"key_4": null,
"key_5": 31066.0
}
 

Теперь я хочу выбрать этот объект, если в измерениях массива есть объект, который имеет key_c==»Значение 3″, при условии, что у него нет объекта, который имеет key_c ==»Значение 4″. Следует выбрать объект выше, но не тот, что ниже.

 {
"key_1": "uo2",
"key_2": false,
"measurements": [
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_4"
    },
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_P"
    },
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_3"
    },
    {
        "key_a": null,
        "key_b": 37.5,
        "key_c": "Value_001"
    }
],
"key_3": "bwr",
"key_4": null,
"key_5": 31066.0
}
 

Измерения массива могут быть любой длины и не сортируются.

Спасибо

Ответ №1:

Я бы предложил фильтр, подобный этому

 def condition1: any(.key_c == "Value_3");
def condition2: any(.key_c == "Value_4") | not;
select(.measurements|condition1 and condition2)
 

Попробуйте онлайн!

Ответ №2:

Как сжатый однострочный:

 select(.measurements|any(.key_c=="Value_3") and all(.key_c!="Value_4"))