JSONPath は、XPath が XML で使用するのと同じように、JSON のクエリ言語です。ネストされたループを記述する代わりにノードを指定します。ほとんどの場合、必要なのは少数のトークン (「$」、「@」、ドット、括弧、「*」、「..」、スライス、および単純な「[?()]」 フィルターだけです)。このガイドはその短いリストであり、完全な RFC クローンではありません。以下のサンプルを JSONPath Tester に貼り付け、ブラウザーで各式を試してみますが、何もアップロードされません。
クイック回答
すべてのパスは `$` (ドキュメント ルート) で始まります。現在の項目のフィルター内で「@」を使用します。日常の作業には `$.store.book[*].title` を優先します。キーにスペースまたは予約文字が含まれている場合は、`$['store']['book'][0]` を使用します。 `$..author` は任意の深さのフィールドを検索します。フィルターは「$.store.book[?(@.price < 10)]」のようになります。検証するまでは、RFC 9535 を現代の方言として扱い、古い Goessner サンプルを民間伝承として扱います。
1 つのサンプル ペイロード
以下のすべての例では、古典的なブックストア ドキュメント (多くの JSONPath チュートリアルが共有するのと同じ形状) を使用しています。読んでいる間は開いたままにしてください:
- `store.book` - `category`、`author`、`title`、`price`、および場合によっては `isbn` を含むオブジェクトの配列。
- `store.bicycle` - `color` と `price` を含むネストされたオブジェクト。
- ペイロードが 1 行として到着した場合は、まず JSON Minifier & Formatter を使用して整形してからクエリを実行します。
$と@
「$」は、貼り付けた JSON 値のルート、つまりオブジェクトまたは配列全体です。すべての便利な表現はそこから始まります。 `@` はフィルター内でのみ意味を持ち、「テストされている現在の要素」を意味します。フィルタの外側では、「@」は自由浮動カーソルではありません。
- `$` - ドキュメントのルート。
- `[?()]` 内の `@.price` - テスト対象アイテムの `price` フィールド。
- `$.store.book[?(@.isbn)]` - `isbn` キーを持つ書籍 (存在チェック)。
- `$` のない裸のパスは通常、厳密なテスターによって拒否されます。先頭には必ず `$` を付けます。
ドットと括弧
ドット表記は単純な識別子の短縮形です: `$.store.book`。括弧表記は明示的な形式です: `$['store']['book']`。キーが単純な識別子 (スペース、ハイフン、先頭の数字) ではない場合、または多くのツールが照合テーブルに出力する RFC 9535 の正規化されたパス スタイルが必要な場合は、括弧を使用します。
- `$.store.bicycle.color` - 通常のキーには問題ありません。
- `$['content-type']` - キーが JS のような識別子ではない場合に必要です。
- `$['store']['book'][0]['title']` - 1 つのノードへの単一の正規化されたパス (RFC 9535 §2.7 スタイル)。
- インデックスは常に括弧で囲みます。`$.store.book.0` ではなく、`$.store.book[0]` です。
* そして ..
`*` は、「このレベルのすべての子供」を表すワイルドカードです。 「..」は再帰的降下です。ツリーをたどり、任意の深さで一致を収集します。ワイルドカードは浅いままです。大きなドキュメントでは、降下に驚かされる可能性があります。
- `$.store.book[*].title` - すべての本のタイトル (配列項目の 1 レベル)。
- `$.store.*` - `store` の下の `book` と `bicycle` の両方。
- `$..author` - ルート以下のすべての `author`。
- 「$..price」 - 書籍の価格と自転車の価格を合わせて - 1 つだけが必要な場合は、パスを絞り込みます。
スライス
配列スライスでは、括弧内で Python のような `start:end:step` を使用します。終了の省略は「最初から」または「最後まで」を意味します。負のインデックスは、実装でサポートされている場合は末尾からカウントされます。
- `$.store.book[0:2]` - 最初の 2 冊の本 (インデックス 0 と 1)。
- `$.store.book[-1:]` - 負のインデックスを許可するエンジンに関する最後の本。
- `$.store.book[::2]` - ステップがサポートされている場合は 1 冊おきの本。
- 選択された配列項目をスライスします。それらの後にフィールドをチェーンします: `$.store.book[0:2].title`。
シンプルなフィルター
フィルターは `[?(...)]` 内に配置され、式が true の項目を保持します。 `@` は現在のアイテムです。通常、比較では、loose JavaScript のように型を強制しません。`1 == "1"` は多くの場合 false です。等価性、不等号、数値比較、`&&`、`||`、`!`、および存在などのフィルターを退屈なものにしておきます。
- `$.store.book[?(@.price < 10)]` - 安い本。
- `$.store.book[?(@.price < 10 && @.category == 'fiction')].title` - フィルターをかけてからフィールドを抽出します。
- `$.store.book[?(@.isbn)]` - `isbn` が付いたアイテム。
- ルート自体が配列でない限り、単独のオブジェクトのルートではなく、スキャンしている配列にフィルターを置きます。
RFC 9535 と古いゲスナー方言の比較
Stefan Goessner の 2007 年の記事は JSONPath を普及させ、多くのライブラリが今でもその例をコピーしています。 RFC 9535 (2024) は IETF 標準です。文法がより明確になり、パスが正規化され、「eval anything」エスケープ ハッチが少なくなります。 `[(@.length-1)]` などのスクリプト セレクターやフィルター内の自由形式 JavaScript は、安全なブラウザ テスターではなく、古い西部に属します。
- RFC 9535 - 標準化された演算子、相互運用可能な実装のために設計された `$['store']['book'][0]` のような正規化されたパス。
- Goessner 時代のサンプル - 今でもブログ記事のいたるところにあります。本番環境に出荷する前に検証してください。
- No-eval サブセット - 貼り付けられた API ペイロードに必要なもの。 Reject script selectors;パスを JavaScript として実行しないでください。
- 2 つのツールの意見が一致しない場合は、どちらが正しいと感じているかではなく、どちらの方言を主張しているかを確認してください。
フルスペックではない
この記事は、毎日入力する式についての虎の巻です。規範的な詳細については、RFC 9535 を参照してください。独自の JSON に対するプライベート トライアウトについては、JSONPath Tester を使用してください。
5 つのコピー&ペーストの例
書店のサンプルに対して、次の順序で試してください。
- `$.store.book[*].title` - すべてのタイトルをリストとして表示します。
- `$..author` - 再帰降下によるすべての作成者。
- `$.store.book[0:2]` - 最初の 2 つの書籍オブジェクト。
- `$.store.book[?(@.price < 10)]` - 価格 10 未満の書籍。
- `$.store.book[?(@.price < 10)].title` - 同じフィルター、タイトルのみ。
レコードのフラット リストを抽出した後、スプレッドシート ビューが必要になる場合があります。オブジェクトの JSON 配列を JSON to CSV Converter にパイプします。まだ調査中のネストされた API BLOB については、形状が明確になるまで JSONPath に留まってください。
よくある質問
すべての JSONPath は $ で始まりますか?
はい、実際にはそうです。 `$` はルートに名前を付けます。厳密なツールは、それを省略したパスを拒否します。
@をいつ使用するのですか?
現在の要素として `[?()]` フィルター内のみ。これは、パスの先頭にある `$` の代わりにはなりません。
一致がゼロだったのはなぜですか?
有効なパスは何も一致しません。一般的な原因: 配列ではなくオブジェクトのルートをフィルタリングしている、キーのタイプミス、または JavaScript の型強制が期待されています。 `$..field` を試してフィールドが存在することを確認し、締めます。
JSONPath は JMESPath または jq と同じですか?
いいえ、関連するアイデア、異なる構文とライブラリ。コードベースごとに 1 つの方言を選択し、それを守ります。
プライベート API 応答を安全にテストできますか?
アップロードせずにエバリュエーターがブラウザで実行される場合は、はい。 JSONPath Tester は、抽出された JSON または正規化されたパスの貼り付け、クエリ、コピーを行うために構築されています。
ToolsMinify で試してみる
以下のすべてのツールはブラウザで実行できます - 無料、サインアップなし、何もアップロードされません。
- JSONパステスター - JSON を貼り付け、式を実行し、一致または抽出された値をコピーします。
- JSON ミニファイアーとフォーマッタ - ペイロードをクエリする前に、ペイロードを整形印刷または縮小します。
- JSON から CSV へのコンバーター - オブジェクトのフラットな JSON 配列を抽出した後、CSV に変換します。
- すべての開発者ツール - 完全なカテゴリインデックス。
無料でお試しください
JSONPath Tester を開き、書店サンプルをロードし、`$.store.book[?(@.price < 10)].title` を貼り付けます。安価なタイトルがすべてデバイス上に表示されるはずです。