公式JQロゴ | |
| パラダイム | 純粋関数型プログラミング、JSON指向処理、暗黙プログラミング |
|---|---|
| デザイン: | スティーブン・ドラン |
| 初登場 | 2012年8月21日 |
| 安定版リリース | 1.7.1 [1]
/ 2023年12月13日 |
| 実装言語 | jq: C gojq: Go jaq: Rust jqjq:jq |
| プラットフォーム | クロスプラットフォーム[注1] |
| OS | クロスプラットフォーム[注2] |
| ライセンス | MIT [注3] |
| Webサイト | jqlang.github.io/jq |
jq は、すべてのJSON値が定数である、非常に高レベルの レキシカル スコープ関数 型プログラミング言語です。jq は、バックトラックと、JSON データの無限に長いストリームの管理をサポートします。これは、 IconおよびHaskellプログラミング言語に関連しています。この言語は、名前空間ベースのモジュール システムをサポートし、クロージャもサポートしています。特に、関数と関数式は、他の関数のパラメーターとして使用できます。
jqの元々の実装はHaskell [3]で行われ、その後すぐにCに移植されました。
歴史
jqはStephen Dolanによって作成され、2012年10月にリリースされました。[4] [5]これは「 JSONデータ用のsed のようなもの」と説明されました。 [6]正規表現 のサポートはjqバージョン1.5で追加されました。
jqの「ラッパー」プログラムであるyqは、YAML、XML、TOMLのサポートを追加します。これは2017年に初めてリリースされました。[7]
Goの実装であるgojqは、2019年に最初にリリースされました。[8] gojqはjqを拡張してYAMLのサポートを追加しました。
Rust実装であるjaqのプロジェクト目標は、ほとんどの場合jqとの互換性を維持しながら、jqのより高速で正確な実装をすることです。2024年3月時点では、モジュール、SQLスタイルの演算子、非常に大きなJSONドキュメント用のストリーミングパーサーなど、jqの特定の高度な機能はプロジェクト目標から明示的に除外されています。[9]
jq 実装である jqjq は、2022 年に最初にリリースされました。jqjq は、特にそれ自体を実行でき、REPL があり、eval をサポートしています。
使用法
コマンドラインの使用
jq は通常、コマンドラインで使用され、 curlなどの他のコマンドライン ユーティリティと一緒に使用できます。次の例は、コマンドの出力をjq フィルターにパイプして、このWikipediacurlページに関連付けられたカテゴリ名を決定する方法を示しています。
$ curl 'https://en.wikipedia.org/w/api.php?action=parse&page=jq_(programming_language)&format=json' | jq '.parse.categories[]."*"'
このパイプラインによって生成される出力は JSON 文字列のストリームで構成され、最初のいくつかは次のとおりです。
「短い説明のある記事」
「Wikidata に一致する短い説明」 「
動的に型付けされたプログラミング言語」
「機能的な言語」
「プログラミング言語」
「2012 年に作成されたプログラミング言語」
「クエリ言語」
「2012 年のソフトウェア」
curl上記のコマンドは、このページのMediaWiki APIを使用してJSONレスポンスを生成します。パイプにより、 |出力は標準のUnixシェルcurlメカニズムであるjqでアクセスできるようになります。[10]
示されている jq フィルターは、jq パイプラインの略語です。
.["解析"] | .["カテゴリ"] | .[] | .["*"]
これは、 の呼び出しによって生成されるネストされた JSON 構造に対応します。jq パイプラインは、Unix スタイルのパイプラインと
curl同じ方法で 文字を使用して構築されることに注意してください。|
埋め込み使用
C と Go の両方の実装ではライブラリが提供されており、jq 機能を他のアプリケーションやプログラミング環境に埋め込むことができます。
たとえば、gojqはSQLiteと統合されており、 SQLjq文で関数を使用できます。[11]この関数は「決定論的」としてマークされているため、 「CREATE INDEX」コマンドで使用できます。 [12]
動作モード
jq は、デフォルトでは JSON 入力の「ストリーム エディター」として機能します。これは、sedユーティリティがテキスト行の「ストリーム エディター」として考えられるのと同じです。ただし、jq には他にもいくつかの操作モードがあります。
- 1 つ以上のソースからの入力をテキスト行として扱うことができます。
- 指定されたソースからの入力ストリームを JSON 配列に収集できます。
- いわゆる「ストリーミング パーサー」を使用して JSON 入力を解析し、すべての「リーフ」パスの [パス、値] 配列のストリームを生成することができます。
「ストリーミング パーサー」は、JSON 入力の 1 つ以上が大きすぎてメモリに収まらない場合に特に便利です。これは、メモリ要件が通常非常に小さいためです。たとえば、JSON オブジェクトの任意の大きさの配列の場合、ピーク時のメモリ要件は、最大のトップレベル オブジェクトを処理するために必要なメモリ要件とそれほど変わりません。
これらの動作モードは、一定の制限内で組み合わせることができます。
構文と意味
種類
すべてのJSON値はjqの値であり、それに応じて以下の表に示す型を持ちます。[13] gojqとjaqの実装は整数と非整数を区別します。gojqの実装は、Haskellのjqの元の実装と同様に、 無制限精度の整数演算をサポートしています。
null は、他の JSON スカラーと同様に値です。ポインターや「null ポインター」ではありません。
( NaNnanに対応) と( IEEE 754を参照) は、JSON 値ではない唯一の 2 つの jq スカラーです。
infinite
フォーム
関数の作成、条件文、ストリームの削減、モジュール システムには特別な構文形式があります。
フィルター
以下は、2 から 36 までの任意の基数の整数をフォーマットするための、名前付きパラメータ化フィルタを定義する方法を示した例です。実装は暗黙の (またはポイントフリーの) プログラミングを示しています。
# 無限精度の整数演算には gojq を使用する
def tobase($b):
定義数字: "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"[.:.+1];
def mod: . % $b;
定義div: ((. - mod) / $b);
def digits: recurse( select(. >= $b) | div) | mod ;
select(2 <= $b かつ $b <= 36)
| [数字 | 桁] | 逆順 | 加算;
次の例は、古典的な「SEND MORE MONEY」という言葉による算数ゲームにおけるジェネレーターの使用法を示しています。
def send_more_money:
def choose(m;n;used): ([range(m;n+1)] - used)[];
定義数(a;b;c;d): 1000*a + 100*b + 10*c + d;
定義num(a;b;c;d;e): 10*num(a;b;c;d) + e;
初め(
1 百万ドル
| 0 として $o
| $s として(8;9;[]) を選択する
| 選択(2;9;[$s]) を $e として
| $n として(2;9;[$s,$e]) を選択する
| 2;9;[$s,$e,$n] を $d として選択
| 2;9;[$s,$e,$n,$d]) を $r として選択します
| 2;9;[$s,$e,$n,$d,$r]) を $y として選択します
| 選択(num($s;$e;$n;$d) + num($m;$o;$r;$e) ==
数値($m;$o;$n;$e;$y))
| [$s、$e、$n、$d、$m、$o、$r、$e、$m、$o、$n、$e、$y] );
構文解析式文法
jqと構文解析表現文法(PEG)形式主義 の間には非常に密接な関係があります。 [14] この関係は、次の表に示す7つの基本的なPEG操作とjq構造の同等性から生じています。
ポートとバリアント
gojqは「純粋なGo」実装です。また、jaq [9]と呼ばれるjqの方言のRust実装もあり、これには表示的意味論が指定されています。[15]
注記
参考文献
文献
- Janssens, Jeroen ( 2021 ). コマンドラインでのデータサイエンス。O'Reilly Media。ISBN 9781492087885。
- Janssens, Jeroen (2014)。『コマンドラインでのデータサイエンス: 実績のあるツールで未来に立ち向かう』O'Reilly Media . ISBN 9781491947807。
- Marrs, Tom (2017)。JSON at Work : Web 向け実践的データ統合。O'Reilly Media。ISBN 9781491982419。
その他
- ^ 「jq 1.7.1 をリリース」。
- ^ abc 「jqをダウンロード」。jq 。 2023年1月6日閲覧。
- ^ https://github.com/jqlang/jq/commit/eca89acee00faf6e9ef55d84780e6eeddf225e5c
- ^ ヤンセン 2014年。
- ^ “jq”. jq . 2023年1月6日閲覧。
- ^ 「sedのように」。2013年4月14日時点のオリジナルよりアーカイブ。
- ^ 「リリース v2.0.0 · kislyuk/yq」。GitHub。
- ^ 「リリース v0.0.1 · itchyny/gojq」。GitHub。
- ^ ab "01mf02/jaq: 正確性、スピード、シンプルさを重視した jq クローン". GitHub . 2024 年3 月 6 日閲覧。
- ^ “チュートリアル”. jq . 2023年1月6日閲覧。
- ^ "sqlite_jq". GitHub .
- ^ 「FAQ」. GitHub .
- ^ “マニュアル”. jq . 2023年1月6日閲覧。
- ^ “PEG”. PEG .
- ^ Färber, Michael (2023). 「表示的意味論とjqの高速インタープリター」. arXiv : 2302.10576 [cs.LO].
外部リンク
- jqホームページ
- gojq - 純粋な Go 実装
- jaq - Rust 実装
- jqjq - jq 実装
- jq よくある質問
- 素晴らしい jq - jq 関連リソースの厳選リスト
- Rosetta Code比較プログラミングタスク プロジェクト サイトの jq プログラミング言語ページ
