Обработка Bash JSON — как проверить, все ли объекты в массиве удовлетворяют условию

#json #shell #jq

#json #оболочка #jq

Вопрос:

Я пытаюсь написать функцию bash, которая будет анализировать ответ json и утверждать, удовлетворяет ли массив объектов некоторому условию, но я ничего не добился с тестированием этого состояния.

Примерный JSON после начальных преобразований:

 [
  {
    "key": "Org1",
    "value": true
  },
  {
    "key": "Org2",
    "value": false
  }
]

  

Условие состоит в том, чтобы все элементы (независимо от длины массива) имели значение == true .

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

Кто-нибудь может помочь?

Комментарии:

1. echo "$json" | jq 'all(.value)' тесты свойства value каждого объекта в массиве являются истинными.

Ответ №1:

Вы можете использовать all функцию для уменьшения массива логических значений * до true значения, если все логические значения имеют значение true. jq выведет это значение, которое вы можете получить с помощью подстановки команд.

 result=$(jq 'map(.value) | all' tmp.json)
  

Тем не менее, вам может не понадобиться фактический вывод. Может быть достаточно использовать --exit-status опцию (короткую форму -e ), чтобы проверить, вернется ли jq возврат true или нет.

 if jq -e 'map(.value) | all' tmp.json > /dev/null; then
   echo "All were true"
else
   echo "At least one was false"
fi
  

* Среди прочего; см. Комментарий @peak ниже

Комментарии:

1. Технически, несмотря на документацию, all семейство фильтров использует достоверность, а не true критерий. Рассмотрим, например all(1;.) , #=> true; all(nan;.) #=> true; all(empty;.) #=> true; all(null;.) #=> false ;

2. Святая корова, я не видел этой all функции. Большое вам спасибо за это!