§

JSONPath 式をテスト

出力形式:
JSONPath クイックリファレンス
Token Meaning
$ドキュメントのルート要素
@現在の要素(フィルター式の内部で使用)
.子メンバー演算子:名前付きの子を選択
..再帰的降下:すべての子孫を検索
*ワイルドカード:任意の要素またはプロパティに一致
[*]配列のすべての要素
[n]インデックス n の配列要素(ゼロ始まり)
[start:end]start から end まで(end を含まない)の配列スライス
[?(@.x)]フィルター:プロパティ x が存在する要素
[?(@.x==1)]フィルター:プロパティ x が 1 に等しい要素
[(@.length-1)]スクリプト式:配列の最後の要素

JSONPath は API のコントラクトを実際のペイロードに対して確認する必要がある場面ならどこでも登場します。Postman の回帰テストを作成する日本のフィンテックチームは、テストタブで JSONPath を使用してレスポンスフィールドをアサートし、k6 の負荷テストスクリプトは API レスポンスから jsonpath() で値を取り出して check() ブロック内の SLA しきい値を検証します。AWS Step Functions は JSONPath を使って状態間のイベントペイロードを整形します。ブラウザータブでこれらの式を実行することで、独自のフィクスチャペイロード、顧客の個人情報、リリース前の API レスポンスをどのホスト型クエリサービスにも送信せずに済みます。

JSONPath とは何ですか?

JSONPath は JSON ドキュメントに対するクエリ言語で、XML に対する XPath の JSON 版です。Stefan Goessner は 2007 年に、パーサーを書かずに JSON ツリー内のノードを指定する短くて読みやすい方法として提案しました。式はルートセレクター $ で始まり、プロパティアクセサー、配列添字、ワイルドカード、再帰的降下、フィルター条件をチェーンして目的のノードを選択します。2024 年に IETF が実装間で断片化していた構文を標準化するために RFC 9535 を公開しました;このテスターは jsonpath-plus で動作します——Goessner ドラフト、RFC 9535 の大部分、およびいくつかの拡張演算子をカバーする広く使われている JavaScript 実装です。

JSONPath の仕組み

JSONPath 式は左から右に読み、JSON ドキュメントを一度に 1 ステップずつ走査します。各ステップは前のステップで生き残ったノードのセットをさらに絞り込みます。完全な評価パイプライン:

  1. ルートセレクター $ でアンカーします。すべての式はここから始まり、オブジェクトであれ配列であれトップレベルの値を指します。先頭の $ がない裸のプロパティ名は有効な JSONPath ではありません。
  2. ドット記法($.store.book)またはブラケット記法($['store']['book'])で子メンバーに入ります。ブラケット記法は、キーにスペース・ハイフン・有効な識別子でない文字が含まれる場合に必要です。
  3. 再帰的降下演算子 .. で一度にすべてのレベルを検索します。式 $..author は深さに関わらずツリーのどこにでも存在するすべての author 値を収集します。これは JMESPath にはない演算子です。
  4. 配列要素をインデックス([0]、jsonpath-plus では最後の要素に [-1])で選択し、[start:end] 記法([0:3] は最初の 3 つを返す)でスライスするか、ワイルドカード [*] ですべての要素を取得します。
  5. [?(...)] 内の述語で要素をフィルタリングします。述語内の @ は現在の要素を参照するため、[?(@.price<10)]price フィールドが 10 未満の要素のみを保持します。フィルターはパスの残りと組み合わせられるため、フィルターしてから降下、または降下してからフィルターができます。
  6. 出力形式を選択します。はマッチしたデータ自体を返します。パスはエンジンが解決した内容を確認できるように各マッチの JSONPath を返します。ポインターは各マッチに対して同等の RFC 6901 JSON ポインターを返します。下流のコンシューマーが JSON Patch や JSON Schema バリデーターの場合に便利です。

この JSONPath テスターを使う理由

  • JSON がブラウザーを離れません。クエリはページ内で実行されるため、本番フィクスチャ、顧客の個人情報、リリース前の API レスポンスがあなたのマシンに残ります。
  • エンジンは jsonpath-plus 9.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 は InputPathResultPathParameters 内で JSONPath を評価して状態間のイベントペイロードを整形します。Argo Workflows は withParam で JSONPath を使用して配列にわたるタスクをファンアウトします。Kubernetes の kubectl -o jsonpath は同じ構文を使用してクラスターオブジェクトからフィールドを取り出します。

実践的な例

正規の Goessner フィクスチャは 4 冊の本を持つ書店ドキュメントで、各本に categoryauthortitleprice があります。そのフィクスチャに対して、式 $.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 メッセージにきれいに貼り付けられます。