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

时间:2016-03-09 23:40:38

标签: json jq

所以我有一个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

3 个答案:

答案 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)

我认为你的意思是isSparseselect过滤器接受评估为布尔值的内容。 isSparse已经是一个布尔值,所以你只需要选择它。 contains用于检查是否有东西在另一个容器中(字符串,数组,对象等)。

$ jq -c '.[] | select(.isSparse)' <blob>