コンテンツにスキップ
ToolsMinify logo
すべての記事

JSONPath を使用して JSON をクエリする - 実際に入力する式

$ と @、ドットと括弧、ワイルドカード、再帰降下、スライス、および単純なフィルターに加えて、RFC 9535 と古い Goessner 方言、および 1 つのサンプル ペイロード上の 5 つのコピー&ペーストの例。

更新日 2026年9月23日8 分で読めます

JSONPath テスターを使用 - 無料

ライブツールを開き、このガイドで学んだことを適用してください。

JSONPath テスターを開く

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 で試してみる

以下のすべてのツールはブラウザで実行できます - 無料、サインアップなし、何もアップロードされません。

無料でお試しください

JSONPath Tester を開き、書店サンプルをロードし、`$.store.book[?(@.price < 10)].title` を貼り付けます。安価なタイトルがすべてデバイス上に表示されるはずです。

JSONPath テスターを使用 - 無料

ライブツールを開き、このガイドで学んだことを適用してください。

JSONPath テスターを開く

関連記事