だから私は以下のようにJSONブロブを持っています:
_[
{
'id': 'something',
'isSparse': true
},
...
]
_
このJSONブロブをフィルターで除外するjq
コマンドをどのように記述すればよいですか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へのアクセスです。これはインターフェースの際に非常に迷惑であり、値は文字列である場合とブール値である場合があります(さらに、数値または文字列としての数値である場合もあります:|)。
_| 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>