2016-02-03 2 views
1

Использование jq Я хотел бы проверить на наличие определенного значения ключа в JSON ниже, например, что «ПРЕДУПРЕЖДЕНИЕ» произошло как " (даже один раз) независимо от количества возвращаемых объектов, так что я возвращаю логическое значение. Для простоты у меня есть 2 объекта ниже, но это может быть 2000jq - Как проверить на наличие определенного значения в ответе JSON

{ 
    "events": [ 
    { 
     "severity": "WARNING", 
     "status": "", 
     "time_raised": "1454502910919", 
     "data_1": "00000000", 
     "data_2": "00000000", 
     "data_3": "00000000", 
     "register_0": "40000", 
     "register_1": "4", 
     "register_2": "10", 
     "register_3": "0" 
    }, 
    { 
     "severity": "ERROR", 
     "status": "", 
     "time_raised": "1454502840915", 
     "data_1": "00000000", 
     "data_2": "00000000", 
     "data_3": "00000000", 
     "register_0": "50000", 
     "register_1": "4", 
     "register_2": "8", 
     "register_3": "0" 
    } 
    ] 
} 

Мой подход был, чтобы попытаться с помощью «содержит» фильтр, как так

jq .events[]|.severity|contains("WARNING") 

который выводит

true 
false 

Поскольку я хочу вернуть одно логическое значение, я попытался объединить значения в одну строку или массив перед использованием 'contains', но я не могу найти способ сделать это.

Я предпочел бы сохранить логику в jq, поэтому я надеюсь, что я пропустил лес из деревьев и что в jq есть простой способ сделать это.

ответ

2

Основываясь на вашем подходе, вы могли бы, например, просто написать:

jq '[.events[]|.severity|contains("WARNING")] | any' 

Или более кратко:

jq 'any(.events[].severity; contains("WARNING"))' 

Если вы хотите, чтобы проверить условия в любом объекте, независимо от того, где это так, тогда рассмотрим использование walk/1.

+0

Я думаю, что «содержит» было введено на примере OP из-за попытки объединить все значения '.severity' в единицу; 'jq '.events | любой (.severity == "WARNING") ''должно быть достаточно. –

Смежные вопросы