使用jq提取JSON数组中具有特定键boolean==true的值?
因此,我有一个JSON blob,如下所示:使用jq提取JSON数组中具有特定键boolean==true的值?,json,jq,Json,Jq,因此,我有一个JSON blob,如下所示: [ { 'id': 'something', 'isSparse': true }, ... ] 我如何编写一个jq命令来过滤掉这个JSON blob,并打印出数组中所有isSparse==true的条目的ID 我尝试了以下方法: cat | jq-c.[]|选择(.operational | contains(“true”)”) 但是要得到以下信息,因为显然true是一个布尔值而不是字符串: jq:error:bool
[
{
'id': 'something',
'isSparse': true
},
...
]
我如何编写一个jq
命令来过滤掉这个JSON blob,并打印出数组中所有isSparse==true的条目的ID
我尝试了以下方法:
cat | jq-c.[]|选择(.operational | contains(“true”)”)
但是要得到以下信息,因为显然true
是一个布尔值而不是字符串:
jq:error:boolean和string不能检查它们的包含
我猜您的意思是isSparse
。select
过滤器接收计算结果为布尔值的内容isSparse
已经是一个布尔值,因此您只需选择它即可contains
用于检查其他容器(字符串、数组、对象等)中是否有内容
$jq-c.[]|选择(.isSparse)'
如果任务是“打印数组中isSparse==true的所有条目的ID”,则适当的jq过滤器应为:
.[] | select(.isSparse == true) | .id
如果存在任何重复.id值的可能性,则可以使用以下方法确保只发出不同的值:
map( select(.isSparse == true) | .id ) | unique[]
正如@JeffMercado指出的,如果.isSparse是严格的布尔值,那么选择(.isSparse)就足够了 我添加这个答案,因为它可能在将来对相关场景有所帮助。- 一个具体的例子是访问一个写得不好的API,该API根据使用的端点或过滤器的不同,返回相同的键/值对。这在接口时非常烦人,值有时是字符串,有时是布尔值(此外,有时甚至是数字,或数字作为字符串:|)
添加
| tostring
将根据需要比较值
cat | jq-c.[]选择(.isSparse | tostring | contains(“true”)”
或为精确匹配,略有变化:
cat | jq-c.[]|选择(.isSparse | tostring)==“true”)。
map( select(.isSparse == true) | .id ) | unique[]