2016-03-09 27 views
6

だから私は以下のようにJSONブロブを持っている:jqを使用して特定のキーを持つJSON配列の値を抽出するboolean == true?

[ 
    { 
    'id': 'something', 
    'isSparse': true 
    }, 
    ... 
] 

私は==このJSONブロブをフィルタリングし、くれisSparseを持っているアレイ内のすべてのエントリのIDを印刷しますjqコマンドを書くにはどうすればよいです本当ですか?

jq: error: boolean and string cannot have their containment checked:明らかにtrueはブール値ではなく文字列であるので、

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

が、次を得る:

は、私は、次の試してみました。

答えて

2

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

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

タスクが「真== isSparseを持っているアレイ内のすべてのエントリのIDを印刷する」のであれば、適切なJQフィルタは次のようになります。

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

のいずれかの可能性がある場合は、

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

.isSparseは厳密にブールである場合@JeffMercadoは(.isSparse)を選択し、指摘したように十分であろう:次は重複しない値だけが放射されていることを確認するために使用することができる.ID値は、重複。

4

これは、今後、関連するシナリオで役立つかもしれないので、この回答を追加します。 - これの具体的な例は、使用されたエンドポイントまたはフィルタによって異なるキー/値のペアを返す不適切なAPIにアクセスすることです。インターフェースするとき、これは非常に迷惑であり、その値は時々、文字列と他の時点でブーリアン(また、時には数、または文字列として番号:|)である


値を比較する| tostring追加します望んだ通りに;

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

または完全一致、わずかなバリアントの:

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

関連する問題