Как проверить наличие необязательного поля в jq? - PullRequest
2 голосов
/ 28 октября 2019

У меня есть jq фильтр:

some_command | jq -r '.elements[] | select(.state=="LIVE" and .group == "some_text" and .someFlag == false) | .name'

someFlag - необязательное поле. Следовательно, когда оно отсутствует, выражение не показывает никакого результата. Я хочу проверить:

  • , если присутствует someFlag, проходить проверку, только если она имеет значение false
  • , если someFlag отсутствует, обрабатывать его как false

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

В данном контексте прямой перевод:

  • , если присутствует someFlag, проходите проверку, только если она имеет ложное значение
  • , если someFlag не являетсяв настоящее время трактуйте это как ложное

в jq:

if has("someflag") then .someflag == false else false end

Настраиваемый фильтр

.elements[]
| select(.state == "LIVE"
         and .group == "some_text"
         and (if has("someFlag")
              then .someFlag == false 
              else false
              end))
| .name

[Этоответ был обновлен в соответствии с обновлением до Q.]

2 голосов
/ 28 октября 2019

Я использовал альтернативный оператор, //:

(.someFlag // false) == false)

Таким образом, если .someFlag не существует, он обрабатывается как ложное.

Полное выражение:

some_command | jq -r '.elements[] | select(.state=="LIVE" and .group == "some_text" and (.someFlag // false) == false)) | .name'

Из jq документации:

Альтернативный оператор // :

Фильтр вида a // b производиттот же результат, что и a, если a дает результаты, отличные от false и null. В противном случае a // b выдаст те же результаты, что и b.

. Это полезно для предоставления значений по умолчанию: .foo // 1 будет иметь значение 1, если на входе нет элемента .foo. Это похоже на то, как или иногда используется в Python (оператор jq или зарезервирован для строго булевых операций).

...