基本フィルター
恒等フィルター:.
最も単純なフィルターは . です。このフィルターは入力を受け取り、同じ値を出力します。つまり、恒等演算子です。
jqは既定ですべての出力を整形するため、. だけからなる簡単なプログラムを使って、たとえば curl のJSON出力を整形できます。
恒等フィルター自体は入力の値を変更しませんが、jqの処理によって、変更されたように見えることがあります。たとえば、jqの現在の実装では、次の式を評価すると、
1E1234567890 | .
少なくとも1つのプラットフォームで 1.7976931348623157e+308 が生成されます。これは、数値を解析する過程で、この特定の版のjqがIEEE754の倍精度表現へ変換し、精度が失われたためです。
jqによる数値の扱いはこれまでに変化しており、今後も関連するJSON標準が定める範囲内で変化する可能性が高いと考えられます。また、ビルド設定のオプションによって、jqの数値処理の方法が変わることがあります。
したがって、以下の説明は、jqの現在の版の動作を記述することを意図したものであり、動作を規定するものと解釈すべきではない、という前提で示します。
(1) まだIEEE754の倍精度表現へ変換されていない数値に対して算術演算を行うと、IEEE754表現への変換が発生します。
(2) jqは、数値リテラルの元の十進精度を維持しようとします(ビルド設定のオプション --disable-decnum が使われなかった場合)。ただし、1E1234567890 のような式では、指数が大きすぎると精度が失われます。
(3) 数値の切り詰められていない大きな十進数表現が利用できる場合、比較はその表現を使って行われます。以下の実行例の1つで、この動作を示します。
以下の実行例では、組込み関数 have_decnum を使って、ビルド設定のオプション --disable-decnum を使った場合と使わなかった場合に期待される違いを示します。また、このオプションの使用の有無にかかわらず、実行例から作成した自動テストが成功するようにしています。
実行例 1
コマンド
jq '.'入力
"Hello, world!"出力 1
"Hello, world!"実行例 2
コマンド
jq '.'入力
0.12345678901234567890123456789出力 1
0.12345678901234567890123456789実行例 3
コマンド
jq '[., tojson] == if have_decnum then [12345678909876543212345,"12345678909876543212345"] else [12345678909876543000000,"12345678909876543000000"] end'入力
12345678909876543212345出力 1
true実行例 4
コマンド
jq '[1234567890987654321,-1234567890987654321 | tojson] == if have_decnum then ["1234567890987654321","-1234567890987654321"] else ["1234567890987654400","-1234567890987654400"] end'入力
null出力 1
true実行例 5
コマンド
jq '. < 0.12345678901234567890123456788'入力
0.12345678901234567890123456789出力 1
false実行例 6
コマンド
jq 'map([., . == 1]) | tojson == if have_decnum then "[[1,true],[1.000,true],[1.0,true],[1.00,true]]" else "[[1,true],[1,true],[1,true],[1,true]]" end'入力
[1, 1.000, 1.0, 100e-2]出力 1
true実行例 7
コマンド
jq '. as $big | [$big, $big + 1] | map(. > 10000000000000000000000000000000) | . == if have_decnum then [true, false] else [false, false] end'入力
10000000000000000000000000000001出力 1
trueオブジェクトの識別子による索引:.foo、.foo.bar
最も単純で役に立つフィルターは .foo という形式です。JSONオブジェクト(辞書やハッシュとも呼ばれます)を入力として与えると、.foo はキー"foo"が存在する場合にその値を、存在しない場合にnullを生成します。
.foo.bar という形式のフィルターは .foo | .bar と同じです。
.foo の構文は、単純で識別子のようなキーにだけ使えます。つまり、英数字とアンダースコアだけで構成され、数字で始まらないキーです。
キーに特殊文字が含まれる場合や数字で始まる場合は、."foo$" のように二重引用符で囲むか、.["foo$"] を使う必要があります。
たとえば、.["foo::bar"] と .["foo.bar"] は使えますが、.foo::bar は使えません。
実行例 1
コマンド
jq '.foo'入力
{"foo": 42, "bar": "less interesting data"}出力 1
42実行例 2
コマンド
jq '.foo'入力
{"notfoo": true, "alsonotfoo": false}出力 1
null実行例 3
コマンド
jq '.["foo"]'入力
{"foo": 42}出力 1
42オブジェクトの識別子による索引(エラーを抑制):.foo?
.foo と同様ですが、. がオブジェクトでなくてもエラーを出力しません。
実行例 1
コマンド
jq '.foo?'入力
{"foo": 42, "bar": "less interesting data"}出力 1
42実行例 2
コマンド
jq '.foo?'入力
{"notfoo": true, "alsonotfoo": false}出力 1
null実行例 3
コマンド
jq '.["foo"]?'入力
{"foo": 42}出力 1
42実行例 4
コマンド
jq '[.foo?]'入力
[1,2]出力 1
[]オブジェクトの索引:.[<string>]
.["foo"] のような構文を使って、オブジェクトのフィールドを検索することもできます(前述の .foo はこの省略形ですが、識別子のような文字列にだけ使えます)。
配列の索引:.[<number>]
索引の値が整数の場合、.[<number>] で配列を参照できます。配列の索引は0から始まるため、.[2] は3番目の要素を返します。
負の索引も使えます。-1は最後の要素、-2は最後から2番目の要素を指し、以下も同様です。
実行例 1
コマンド
jq '.[0]'入力
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]出力 1
{"name":"JSON", "good":true}実行例 2
コマンド
jq '.[2]'入力
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]出力 1
null実行例 3
コマンド
jq '.[-2]'入力
[1,2,3]出力 1
2配列・文字列のスライス:.[<number>:<number>]
.[<number>:<number>] という構文を使うと、配列の部分配列や文字列の部分文字列を返せます。.[10:15] が返す配列の長さは5で、索引10(含む)から索引15(含まない)までの要素を含みます。どちらの索引も負の値にできます。その場合、配列の末尾から逆向きに数えます。また、どちらも省略でき、その場合は配列の先頭または末尾を指します。索引は0から始まります。
実行例 1
コマンド
jq '.[2:4]'入力
["a","b","c","d","e"]出力 1
["c", "d"]実行例 2
コマンド
jq '.[2:4]'入力
"abcdefghi"出力 1
"cd"実行例 3
コマンド
jq '.[:3]'入力
["a","b","c","d","e"]出力 1
["a", "b", "c"]実行例 4
コマンド
jq '.[-2:]'入力
["a","b","c","d","e"]出力 1
["d", "e"]配列・オブジェクトの値のイテレーター:.[]
.[index] の構文で索引を完全に省略すると、配列のすべての要素を返します。.[] を入力 [1,2,3] に対して実行すると、1つの配列ではなく、3つの別々の結果として数値を生成します。.foo[] という形式のフィルターは .foo | .[] と同じです。
オブジェクトに対して使うこともでき、その場合はオブジェクトのすべての値を返します。
このイテレーター演算子は、値のジェネレーターであることに注意してください。
実行例 1
コマンド
jq '.[]'入力
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]出力 1
{"name":"JSON", "good":true}出力 2
{"name":"XML", "good":false}実行例 2
コマンド
jq '.[]'入力
[]出力なし
実行例 3
コマンド
jq '.foo[]'入力
{"foo":[1,2,3]}出力 1
1出力 2
2出力 3
3実行例 4
コマンド
jq '.[]'入力
{"a": 1, "b": 1}出力 1
1出力 2
1.[]?
.[] と同様ですが、.が配列でもオブジェクトでもない場合も、エラーを出力しません。.foo[]? という形式のフィルターは .foo | .[]? と同じです。
カンマ:,
2つのフィルターをカンマで区切ると、両方に同じ入力が渡され、2つのフィルターが出力する値のストリームが順番に連結されます。最初に左側の式が生成するすべての出力が続き、その後に右側の式が生成するすべての出力が続きます。たとえば、フィルター .foo,
.bar は"foo"フィールドと"bar"フィールドの両方を、別々の出力として生成します。
, 演算子は、ジェネレーターを構築する方法の1つです。
実行例 1
コマンド
jq '.foo, .bar'入力
{"foo": 42, "bar": "something else", "baz": true}出力 1
42出力 2
"something else"実行例 2
コマンド
jq '.user, .projects[]'入力
{"user":"stedolan", "projects": ["jq", "wikiflow"]}出力 1
"stedolan"出力 2
"jq"出力 3
"wikiflow"実行例 3
コマンド
jq '.[4,2]'入力
["a","b","c","d","e"]出力 1
"e"出力 2
"c"パイプ:|
|演算子は、左側のフィルターの出力を右側のフィルターの入力へ渡すことで、2つのフィルターを組み合わせます。Unixシェルのパイプに慣れていれば、それと似たものと考えられます。
左側が複数の結果を生成すると、右側はそれぞれの結果に対して実行されます。したがって、式 .[] | .foo は入力配列の各要素から"foo"フィールドを取り出します。これは直積であり、意外に感じることがあります。
.a.b.c は .a | .b | .c と同じであることに注意してください。
また、. は「パイプライン」の特定の段階、具体的には . という式が現れる位置での入力値です。したがって、.a | . | .b は .a.b と同じです。中央の . は、.a が生成した値を指すためです。
実行例 1
コマンド
jq '.[] | .name'入力
[{"name":"JSON", "good":true}, {"name":"XML", "good":false}]出力 1
"JSON"出力 2
"XML"丸括弧
丸括弧は、一般的なプログラミング言語と同様に、式をまとめる演算子として働きます。
実行例 1
コマンド
jq '(. + 2) * 5'入力
1出力 1
15訳注
訳注:この節の数値精度の説明は、現在の実装とビルド設定を条件としています。後続の数値型・算術の説明だけから、すべてのビルドで同じ精度保持や比較になると解釈しないでください。入力数値リテラルの保持に対応するかはhave_literal_numbers、現在のdecnumバックエンドでビルドされたかはhave_decnumの説明も参照してください。