JSONPathとは?基本構文と活用例
JSONPathはJSONデータの特定の値を取り出すためのクエリ言語です。XPathのJSON版として設計されており、ネストが深いJSONからのデータ抽出・APIレスポンスの特定フィールド取得に活用できます。
JSONPathの基本構文
$ はルート要素を指します。$.user.nameは「userオブジェクトのnameフィールド」を表します。$.items[0]は配列の最初の要素、$.items[*]はすべての要素、$.items[0:3]はスライス(0〜2番目)、..nameは再帰下降で全階層のnameを検索します。JSON Path Testerではこれらをリアルタイムでテストして結果を即確認できます。@記号は現在処理中の要素を指す特別な構文で、フィルター式で使います。$.items[-1]のような負のインデックスで最後の要素を指定することもできます。JSONPathの仕様(RFC 9535)は2024年に公開され、仕様の曖昧さが解消されつつありますが、実装によって動作が異なることがあるため、実際の実行環境(jq・JSONPath Plus・Python jsonpathなど)でのテストが推奨されます。
フィルター式の使い方
$.items[?(@.price > 100)]は「priceが100より大きい要素」を抽出するフィルター式です。@は現在の要素を指します。$.users[?(@.active == true)]でアクティブユーザーだけを取得したり、$.products[?(@.category == "book")]でカテゴリを絞り込んだりできます。比較演算子は>・<・>=・<=・==・!=が使えます。&&や||で複数の条件を組み合わせることもできます($.items[?(@.price > 50 && @.inStock == true)])。文字列のパターンマッチにはmatch()関数を使う実装もありますが、すべての環境で対応しているわけではありません。JSON Path Testerで実際のJSONデータに対してフィルター式を試すと、構文が正しいか即座に確認できます。
どんな場面で使うか
REST APIのレスポンスから特定のフィールドだけ取り出す、CIパイプラインでJSONファイルの特定値を確認する、AWS CLIの--queryオプション(JMESPath形式)、Kubernetes YAMLのvalueFrom.fieldRef、jq(JSONプロセッサ)の操作確認などで活用できます。テスト自動化(PlaywrightやJestのAPIテスト)でAPIレスポンスのネストした値をアサートするときにもJSONPathが使われます。GitHub Actionsのworkflowファイルでjqコマンドを使いJSONを処理するステップを書く際も、事前にJSON Path Testerで式を確認しておくとCIを何度も回す手間が省けます。Postmanのテストスクリプトでもpm.response.json()から値を取り出す際に同様の操作が必要です。
jqとの違い
jqはJSONを処理するUnixコマンドラインツールでJSONPath以上に強力なフィルタリングと変換ができます。jqは独自の構文(.users[].name など)を持ち、値の変換・計算・文字列操作なども可能です。JSONPathはより標準的で多くの言語ライブラリが対応しており(JavaScript・Python・Java)、ブラウザ上でのテストに向いています。JSON Path TesterではインストールなしにブラウザでJSONPath式を試せます。jqの使い方を学ぶ際もJSON Path Testerでデータ構造を先に確認してからjqのパスを書くと効率的です。JSONPathに相当するjqの式を並べてみると、$.users[*].name は jq では [.users[].name] のように書きます。両者の対応を理解すると相互の変換が容易になります。