所以我有一个JSON blob如下:
[
{
'id': 'something',
'isSparse': true
},
...
]
如何编写jq
命令,过滤掉此JSON blob,并打印出数组中所有具有isSparse == true的条目的ID? < / p>
我尝试了以下内容:
cat <blob> | jq -c '.[] | select(.operational | contains("true"))'
但是得到以下内容,因为显然true
是布尔值而不是字符串:
jq: error: boolean and string cannot have their containment checked
。
答案 0 :(得分:12)
如果任务是“打印数组中所有具有isSparse == true的条目的ID”,则适当的jq过滤器将为:
.[] | select(.isSparse == true) | .id
如果存在重复.id值的可能性,则可以使用以下内容来确保仅发出不同的值:
map( select(.isSparse == true) | .id ) | unique[]
正如@JeffMercado所指出的,如果.isSparse是严格的布尔值,那么select(.isSparse)就足够了。
答案 1 :(得分:5)
我添加了这个答案,因为它可能对将来的相关场景有所帮助。 - 一个具体的例子是访问写得不好的API,它根据使用的端点或过滤器不同地返回相同的键/值对。这在连接时非常烦人,有时候是一个字符串,有时候是一个布尔值(此外,有时甚至是一个数字,或者一个数字作为字符串:|)
添加cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'
会根据需要比较值;
cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'
或完全匹配,轻微变体:
{{1}}
答案 2 :(得分:4)
我认为你的意思是isSparse
。 select
过滤器接受评估为布尔值的内容。 isSparse
已经是一个布尔值,所以你只需要选择它。 contains
用于检查是否有东西在另一个容器中(字符串,数组,对象等)。
$ jq -c '.[] | select(.isSparse)' <blob>