使用jq提取JSON数组中具有特定键boolean==true的值?

使用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

因此,我有一个JSON blob,如下所示:

[
  {
    '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[]