所以我有一个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)就足够了.
我猜你的意思是isSparse。该select过滤器需要的东西,其值是布尔值。isSparse已经是一个布尔值,所以你只需要选择它。 contains用于检查某个东西是否在另一个容器(字符串、数组、对象等)中。
$ jq -c '.[] | select(.isSparse)' <blob>
Run Code Online (Sandbox Code Playgroud)
我添加此答案,因为它可能在将来对相关场景有用。-一个具体的例子是访问一个写得不好的API,该API根据使用哪个端点或过滤器而不同地返回相同的键/值对。接口时非常烦人,有时值是一个字符串,在其他时候是布尔值(此外,有时甚至是一个数字,或一个数字作为字符串:|)。
加法| tostring将根据需要比较该值;
cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'
或完全匹配(略有变化):
cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'
| 归档时间: |
|
| 查看次数: |
12390 次 |
| 最近记录: |