![](/img/trans.png)
[英]Given a json array, how do I extract a list of key values by key, using jq?
[英]Using jq to extract values in JSON array with a particular key boolean == true?
所以我有一個JSON blob如下:
[
{
'id': 'something',
'isSparse': true
},
...
]
如何編寫一個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
。
如果任務是“打印數組中所有具有isSparse == true的條目的ID”,則適當的jq過濾器將是:
.[] | select(.isSparse == true) | .id
如果存在重復.id值的任何可能性,則可以使用以下內容來確保僅發出不同的值:
map( select(.isSparse == true) | .id ) | unique[]
正如@JeffMercado指出的那樣,如果.isSparse是嚴格的布爾值,則select(.isSparse)就足夠了。
我添加這個答案,因為它可能有助於將來的相關場景。 - 這方面的一個具體示例是訪問寫得不好的API,該API根據使用的端點或過濾器不同地返回相同的鍵/值對。 接口時這非常煩人,有時候是一個字符串,有時候是一個布爾值(此外,有時甚至是一個數字,或者一個數字作為字符串:|)
添加| tostring
| tostring
會根據需要比較值;
cat <blob> | jq -c '.[] | select(.isSparse | tostring | contains("true"))'
或完全匹配,輕微變體:
cat <blob> | jq -c '.[] | select((.isSparse | tostring) == "true")'
我猜你的意思是isSparse
。 select
過濾器接受一個計算為布爾值的東西。 isSparse
已經是一個布爾值,所以你只需要選擇它。 contains
用於檢查是否有東西在另一個容器中(字符串,數組,對象等)。
$ jq -c '.[] | select(.isSparse)' <blob>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.