Как использовать jq, чтобы указать истину или ложь, когда в моем выводе присутствует поле uri json - PullRequest
0 голосов
/ 06 августа 2020

У меня есть JSON, который выглядит следующим образом:

{
   "results":[
      {
         "uri":"www.xxx.com"
      }
   ]
}

EDIT Когда uri отсутствует, JSON выглядит так:

{
"results":[

]
}

В некоторых случаях uri присутствует, а в некоторых случаях нет. Теперь я хочу использовать jq для возврата логического значения, если uri присутствует или нет.

Это то, что я написал до сих пор, но, несмотря на присутствие uri, он дает null. $ {search_query_response} содержит JSON

file_status=$(jq -r '.uri' <<< ${search_query_response})

Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

6 голосов
/ 06 августа 2020

Поскольку вы используете jq, это означает, что вы работаете в контексте сценария оболочки.

Если логический результат должен обрабатываться сценарием оболочки, вы можете сделать jq установить его EXIT_CODE в зависимости от успешности или сбоя запроса JSON, с jq -e

Пример сценария оболочки с использованием EXIT_CODE из jq:

if uri=$(jq -je '.results[].uri') <<<"$search_query_response"
then
  printf 'Search results contains an URI: %s.\n' "$uri"
else
  echo 'No URI in search results.'
fi

См. man jq:
  • -e / --exit-status:
    Устанавливает статус выхода jq на 0, если последние выходные значения не были ни одним false ни null, 1, если последнее выходное значение было false или null, или 4, если действительный результат никогда не был получен. Обычно jq завершается с 2, если возникла проблема с использованием или системная ошибка, 3, если была ошибка компиляции программы jq, или 0, если программа jq была запущена.
    Другой способ установить статус выхода - использовать встроенную функцию halt_error.
1 голос
/ 06 августа 2020

Функция has выполняет задание:

jq '.results|map(has("uri"))|.[]'

map функция has на .results.

...