JSONPath とは何ですか?
JSONPath は JSON ドキュメントに対するクエリ言語で、XML に対する XPath の JSON 版です。Stefan Goessner は 2007 年に、パーサーを書かずに JSON ツリー内のノードを指定する短くて読みやすい方法として提案しました。式はルートセレクター $ で始まり、プロパティアクセサー、配列添字、ワイルドカード、再帰的降下、フィルター条件をチェーンして目的のノードを選択します。2024 年に IETF が実装間で断片化していた構文を標準化するために RFC 9535 を公開しました;このテスターは jsonpath-plus で動作します——Goessner ドラフト、RFC 9535 の大部分、およびいくつかの拡張演算子をカバーする広く使われている JavaScript 実装です。
JSONPath の仕組み
JSONPath 式は左から右に読み、JSON ドキュメントを一度に 1 ステップずつ走査します。各ステップは前のステップで生き残ったノードのセットをさらに絞り込みます。完全な評価パイプライン:
- ルートセレクター
$でアンカーします。すべての式はここから始まり、オブジェクトであれ配列であれトップレベルの値を指します。先頭の$がない裸のプロパティ名は有効な JSONPath ではありません。 - ドット記法(
$.store.book)またはブラケット記法($['store']['book'])で子メンバーに入ります。ブラケット記法は、キーにスペース・ハイフン・有効な識別子でない文字が含まれる場合に必要です。 - 再帰的降下演算子
..で一度にすべてのレベルを検索します。式$..authorは深さに関わらずツリーのどこにでも存在するすべてのauthor値を収集します。これは JMESPath にはない演算子です。 - 配列要素をインデックス(
[0]、jsonpath-plus では最後の要素に[-1])で選択し、[start:end]記法([0:3]は最初の 3 つを返す)でスライスするか、ワイルドカード[*]ですべての要素を取得します。 [?(...)]内の述語で要素をフィルタリングします。述語内の@は現在の要素を参照するため、[?(@.price<10)]はpriceフィールドが 10 未満の要素のみを保持します。フィルターはパスの残りと組み合わせられるため、フィルターしてから降下、または降下してからフィルターができます。- 出力形式を選択します。値はマッチしたデータ自体を返します。パスはエンジンが解決した内容を確認できるように各マッチの JSONPath を返します。ポインターは各マッチに対して同等の RFC 6901 JSON ポインターを返します。下流のコンシューマーが JSON Patch や JSON Schema バリデーターの場合に便利です。
この JSONPath テスターを使う理由
- JSON がブラウザーを離れません。クエリはページ内で実行されるため、本番フィクスチャ、顧客の個人情報、リリース前の API レスポンスがあなたのマシンに残ります。
- エンジンは
jsonpath-plus9.x——多くの本番テストスイートや CI アサーションを支えているのと同じライブラリです。ここで見る結果はビルドパイプラインが見る結果と一致します。 - 3 つの出力モードが一般的な下流コンシューマーをカバーします:コピー貼り付け用の生の値、エンジンの解決をデバッグするためのパス、JSON Patch や JSON Schema ワークフロー用の RFC 6901 ポインター。
- フィルター式は
preventEval: trueで実行されるため、貼り付けられたクエリがホストページに対して任意の JavaScript を実行できません。Slack メッセージ、Jira チケット、同僚のクリップボードからの式を扱う場合に重要です。
JSONPath の主な用途
JSONPath は、手書きの再帰的降下なしに JSON ペイロードからフィールドを取り出す必要があるあらゆる場面に登場します:
- Postman テスト:Postman のテストタブは
pm.response.json()と JSONPath スタイルのアクセスを CI でのアサーションに公開しています。チームは$.data.user.emailのような単一の式を書いてレスポンスからフィールドを取り出しアサートします。 - k6 負荷テスト:k6 スクリプトは
check()ブロック内でjsonpath()を呼び出してレスポンスボディから値を取り出し SLA しきい値をアサートします。Postman でコントラクトを証明したのと同じ式が k6 の負荷テストを制御できます。 - データ変換用 JSON DSL:AWS Step Functions は
InputPath、ResultPath、Parameters内で JSONPath を評価して状態間のイベントペイロードを整形します。Argo Workflows はwithParamで JSONPath を使用して配列にわたるタスクをファンアウトします。Kubernetes のkubectl -o jsonpathは同じ構文を使用してクラスターオブジェクトからフィールドを取り出します。
実践的な例
正規の Goessner フィクスチャは 4 冊の本を持つ書店ドキュメントで、各本に category、author、title、price があります。そのフィクスチャに対して、式 $.store.book[?(@.price<10)].title は 3 ステップで実行されます。まず $.store.book が 4 冊すべての配列に解決されます。次にフィルター [?(@.price<10)] が 10 未満の価格の本(8.95 のエントリ)だけを保持します。最後に .title がその本のタイトルを取り出します。結果は ["Sayings of the Century"] です。パスに切り替えると ["$['store']['book'][0]['title']"] が返り、ポインターは ["/store/book/0/title"] が返ります。
ここで式を試作してから、Postman、k6、kubectl、または Step Functions のステートマシンにそのまま貼り付けてください。貼り付け、クエリ、コピー。ネットワークを越えるものは何もありません。
JSONPath とは何ですか?
JSONPath は JSON ドキュメントに対するクエリ言語で、XML に対する XPath に類似しています。Stefan Goessner が 2007 年に提案し、IETF が 2024 年に RFC 9535 として標準化しました。$(ドキュメントルート)で始まるコンパクトな式構文を使用し、ドット記法、配列添字、ワイルドカード、スライス、再帰的降下(..)、フィルター式([?(...)])をサポートして JSON ツリー内のノードを選択します。
JSONPath は JMESPath や jq とどう違いますか?
3 つとも JSON をクエリしますが、文法と目的が異なります。JMESPath は AWS CLI/SDK の標準で、JSONPath より厳格で、再帰的降下がなく、予測可能な副作用のない射影のために構築されています。jq は JSON をクエリするだけでなく、変換・集約・ストリーム処理もできるチューリング完全なスクリプト言語です。JSONPath は両者の中間に位置します:再帰的降下とフィルターにより JMESPath より表現力があり、jq より軽量で、汎用テストツール(Postman、Playwright、REST Assured、kubectl、Step Functions)で最も広くサポートされている構文です。このテスターは JSONPath を実装しています。
このテスターはどの方言を使用していますか?
このテスターは jsonpath-plus 9.x で動作します。そのライブラリは Goessner 2007 仕様を実装し、RFC 9535 の大部分をカバーし、型チェック(@.string()、@.number()、@.boolean())や親ナビゲーション(^)などの拡張演算子を追加しています。preventEval: true フラグが常に設定されているため、フィルター述語は JavaScript の eval() ビルトインではなく安全なインタープリターで実行されます。貼り付けられたクエリがこのページに対して任意のコードを実行することはできません。
個々のマッチした値をコピーできますか?
はい。クリップボードにコピーボタンは結果ブロック全体を JSON 配列としてコピーします。単一の値を取得するには、出力モードを値に切り替え、結果テキストエリアで必要な行を選択し、ブラウザーの通常のコピーショートカット(Ctrl/Cmd + C)を使用してください。出力はプレーンな JSON テキストのため、コードエディター、ターミナル、Postman テスト、Slack メッセージにきれいに貼り付けられます。