簡體   English   中英

使用jq使用特定鍵boolean == true提取JSON數組中的值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM