JSONクエリ言語
JSONドキュメントから必要な部分を取り出す・組み替えるための言語とその処理系を束ねるハブノート。XMLに対するXPath、HTMLに対するCSSセレクタに相当する役割を、JSONの世界で誰が担うかという話。 #json #dsl #moc
大きく2系統ある
組み込み用のクエリ言語 — SDKやCLIの中に埋め込んで、サーバ応答から必要な部分を安全に抜き出すためのもの。表現力を絞る代わりに、仕様と多言語実装の互換性を重視する。
- JMESPath — ABNF文法による仕様とコンプライアンステストスイートを持つ。AWS CLIの
--query、Azure CLIの--query、Ansibleのjson_queryなどで使われている。算術演算子すらない割り切った設計 - JSONPath — Stefan Gössnerの2007年のブログ記事「JSONPath – XPath for JSON」から始まり、長らく仕様が緩いまま50前後の実装が乱立した。17年後の2024年2月にRFC 9535として標準化された
単体の処理系としての言語 — 手元でJSONを自由にこねるためのもの。表現力を優先する。
- jq — 純粋関数型のDSL。フィルタが値のストリームを変換するというモデルで、算術・正規表現・再帰・ユーザ定義関数・パス式・ストリーミングまで揃う。公式の言語仕様書はなく、事実上の実装依存
jq言語の再実装
jqの言語自体は複数の再実装を生んでいる。言語は共通なので、選択は実装の性質(可搬性・組み込みやすさ・数値精度・起動速度)で決まる。
- gojq — Go実装。任意精度整数、YAML入出力、Goライブラリとしての組み込み。オブジェクトキーの順序は保持しない
- jaq — Rust実装。表示的意味論の論文に基づく実装。起動が速く、CBOR/TOML/XMLまで扱える
- jqjq — jq自身で書かれたセルフホスト実装