Используйте JQ "содержит" и подавлять ошибки, когда ключ не найден - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь получить значение на основе значения «содержит» другого ключа в том же объекте

Я уже пробовал код, и он работает, и выводит желаемый результат, но некоторые объекты в JSON не имеют этого ключа, поэтому я получаю:

jq: error (at <stdin>:1): null (null) and string ("BBC") cannot have their containment checked

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

Использование:

jq '.entries[] | select(.icon | contains("BBC")) | .uuid'

Я хочу получить UUID найденного результата без ошибок и сохранить его в виде переменной в оболочке

"174501xxxxxxxxxxxxxe6342a03"

Входной файл, который передается по каналу

{  
   "entries":[  
      {  
         "uuid":"174501xxxxxxxxxxxxxe6342a03",
         "enabled":true,
         "autoname":true,
         "name":"BBC",
         "number":0,
         "icon":"file:///logos/BBC.png",
         "icon_public_url":"imagecache/1097",
         "epgauto":true,
         "epggrab":[  ],
         "dvr_pre_time":0,
         "dvr_pst_time":0,
         "epg_running":-1,
         "services":[  ],
         "tags":[  ],
         "bouquet":""
      },
      {  
         "uuid":"174501xxxxxxxxxxxxxe6342a04",
         "enabled":true,
         "autoname":true,
         "name":"ABC",
         "number":0,
         "icon_public_url":"imagecache/1098",
         "epgauto":true,
         "epggrab":[  ],
         "dvr_pre_time":0,
         "dvr_pst_time":0,
         "epg_running":-1,
         "services":[  ],
         "tags":[  ],
         "bouquet":""
      }...

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы можете предварительно выбрать только объекты, которые имеют клавишу icon с помощью has("icon").

Из руководства jq 1.5 :

has(key)

Встроенная функция has возвращает ли входной объект имеет заданный ключ, или входной массив имеет элемент с заданным индекс.

jq '.entries[] | select(has("icon")) | select(.icon | contains("BBC")).uuid' file

Однако вы получите ошибку, если ваш объект имеет "icon":null, и в этом случае вы можете использовать:

jq '.entries[] | select(.icon != null) | select(.icon | contains("BBC")).uuid' file
0 голосов
/ 08 января 2019

Существует несколько способов добиться этого с помощью jq. Вы можете использовать условные выражения и ветвления, но я думаю, что самый простой способ - использовать try-catch без catch, чтобы просто заставить замолчать любую ошибку. Документация находится в конце Условия и сравнения

Вот пример , который просто пропустит ошибку и выведет UUID только в случае отсутствия ошибки для этого объекта:

.entries[] | select(.icon | try contains("BBC")) | .uuid

...