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

Rya*_* Yu 10 json jq

所以我有一个JSON blob如下:

[
  {
    'id': 'something',
    'isSparse': true
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

如何编写一个jq命令来过滤掉这个JSON blob并打印出数组中所有具有isSparse == true的条目的ID?

我尝试了以下方法:

cat <blob> | jq -c '.[] | select(.operational | contains("true"))'

但得到以下内容,因为显然true是布尔值而不是字符串:

jq: error: boolean and string cannot have their containment checked.

pea*_*eak 12

如果任务是"打印数组中所有具有isSparse == true的条目的ID",则适当的jq过滤器将是:

.[] | select(.isSparse == true) | .id
Run Code Online (Sandbox Code Playgroud)

如果存在重复.id值的任何可能性,则可以使用以下内容来确保仅发出不同的值:

map( select(.isSparse == true) | .id ) | unique[]
Run Code Online (Sandbox Code Playgroud)

正如@JeffMercado指出的那样,如果.isSparse是严格的布尔值,那么select(.isSparse)就足够了.


Jef*_*ado 5

我猜你的意思是isSparse。该select过滤器需要的东西,其值是布尔值。isSparse已经是一个布尔值,所以你只需要选择它。 contains用于检查某个东西是否在另一个容器(字符串、数组、对象等)中。

$ jq -c '.[] | select(.isSparse)' <blob>
Run Code Online (Sandbox Code Playgroud)


hme*_*ia1 5

我添加此答案,因为它可能在将来对相关场景有用。-一个具体的例子是访问一个写得不好的API,该API根据使用哪个端点或过滤器而不同地返回相同的键/值对。接口时非常烦人,有时值是一个字符串,在其他时候是布尔值(此外,有时甚至是一个数字,或一个数字作为字符串:|)。


加法| tostring将根据需要比较该值;

cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'

或完全匹配(略有变化):

cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'