web-dev-qa-db-ja.com

jqを使用して、特定のキーブール値== trueのJSON配列の値を抽出しますか?

だから私は以下のように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_。

13
Ryan Yu

タスクが「isSparse == trueである配列内のすべてのエントリのIDを出力する」場合、適切なjqフィルターは次のようになります。

.[] | select(.isSparse == true) | .id

.id値が重複する可能性がある場合は、以下を使用して、異なる値のみが出力されるようにすることができます。

map( select(.isSparse == true) | .id ) | unique[]

@JeffMercadoが指摘したように、.isSparseが厳密にブール値である場合、select(.isSparse)で十分です。

12
peak

この回答は、関連するシナリオで将来役立つ可能性があるため、追加します。 -これの具体例は、使用されているエンドポイントまたはフィルターに応じて同じキー/値ペアを異なる方法で返す、不十分に記述されたAPIへのアクセスです。これはインターフェースの際に非常に迷惑であり、値は文字列である場合とブール値である場合があります(さらに、数値または文字列としての数値である場合もあります:|)。


_| tostring_を追加すると、必要に応じて値が比較されます。

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

または完全一致の場合、わずかなバリエーション:

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

5
hmedia1

私はあなたがisSparseを意味すると思います。 selectフィルターは、ブール値に評価されるものを取り込みます。 isSparseはすでにブール値なので、選択するだけです。 containsは、何かが別のコンテナ(文字列、配列、オブジェクトなど)にあるかどうかを確認するために使用されます。

$ jq -c '.[] | select(.isSparse)' <blob>
4
Jeff Mercado