我试图基于同一对象中另一个键的“包含”值来获取值
我已经尝试了一个代码,它可以正常工作并输出所需的结果,但是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":""
}...
答案 0 :(得分:2)
使用jq有多种方法可以实现此目的。您可以使用条件和分支,但我认为最简单的方法是使用try-catch
而不使用catch
来使任何错误保持沉默。该文档位于Conditionals and Comparisons
这里是an example,它将仅忽略该错误,并且仅在该对象没有错误的情况下才打印UUID:
.entries[] | select(.icon | try contains("BBC")) | .uuid
答案 1 :(得分:2)
您只能使用icon
预先选择具有has("icon")
键的对象。
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