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自身で書かれたセルフホスト実装

選び方の目安

  • ライブラリ・SDKの中に「ユーザが書いた式」を埋め込んで評価させたい → JMESPath、またはGoならgojq
  • 対話的にJSONを探索・加工したい、シェルスクリプトで使いたい → jq
  • すでにAWS CLI / Azure CLI / Ansibleを使っている → その場に組み込まれているJMESPathを書くことになる
作成日時: 2026-08-31 19:20 / 更新日時: 2026-08-31 19:20