2015-04-29 2 views
6

Я использую следующую команду JQ для фильтрации JSON. Мое требование - отфильтровать сообщение JSON, если ожидаемый узел присутствует. Или, ничего не делайте. Следовательно, я использую if, elif, ....JSON JQ if without else

sed -n "s/.*Service - //p" $1/response.log* | 
    jq "if (.requests | length) != 0 then .requests |= map(select(.id == \"123\")) 
     elif (.result | length) != 0 then .result |= map(select(.id== \"123\")) 
     else " " end" > ~/result.log 

Похоже, что здесь обязательно. Я не хочу ничего делать внутри блока else. В любом случае, я могу игнорировать другие или просто печатать некоторые whitespce внутри другого.

В этом случае он печатает двойные кавычки «» в файле результатов.

ответ

11

Вы можете использовать идиомы:

if CONDITION then WHATEVER else empty end

empty является фильтром, который не выводит ничего - даже не нулевой , что в конце концов что-то (а именно значение JSON). Это немного похоже на черную дыру, только более черную - она ​​будет потреблять все, что ей предлагается, но в отличие от черной дыры она даже не излучает излучение Хокинга.

В вашем случае, ваш иметь «Элиф» так что использование «еще пустой», вероятно, что вы хотите, но для справки, выше точности эквивалентно:

select(CONDITION) | WHATEVER 

P.S. Я предполагаю, что независимо от цели команды sed это можно было бы сделать более надежно как часть программы jq, возможно, используя walk/1.

+0

Upvote для окончательного предложения. – turiyag

+0

как использовать оператор if для значений типа массива. Например: . [] | {Result ": if (.foo == null) then [] end} [{" foo ": null," bar ":" менее интересные данные "}, {" foo ":" null "," bar ":" less interesting data "}] – devanathan

+0

Пожалуйста, задайте новый вопрос SO. – peak

1

Поскольку вы не вносите никаких дополнительных изменений в объект, просто используйте фильтр «identity» ..

if (.requests | length) then ... else . end 

С другой стороны, вы просто обновить свойство requests или result, если не пусто, используя map. Проверка не требуется. Если он пуст, он будет пустым.

Вы можете упростить фильтр просто:

.requests |= map(select(.id == \"123\")) | .result |= map(select(.id== \"123\"))