使用JQ“包含”并在找不到密钥时抑制错误

时间:2019-01-08 08:20:09

标签: json shell try-catch jq

我试图基于同一对象中另一个键的“包含”值来获取值

我已经尝试了一个代码,它可以正常工作并输出所需的结果,但是JSON中的某些对象没有此键,因此得到:

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

或导致此错误的原因是其他键中的数组,我不确定

使用:

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

我希望找到的结果的UUID没有错误,并将其作为变量存储在shell中

"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 :(得分:2)

使用jq有多种方法可以实现此目的。您可以使用条件和分支,但我认为最简单的方法是使用try-catch而不使用catch来使任何错误保持沉默。该文档位于Conditionals and Comparisons

的末尾

这里是an example,它将仅忽略该错误,并且仅在该对象没有错误的情况下才打印UUID:

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

答案 1 :(得分:2)

您只能使用icon预先选择具有has("icon")键的对象。

来自jq 1.5 Manual

  

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