JSONPathクエリ構文

JSONドキュメントからデータを抽出するためのJSONPathクエリ構文を学びましょう。式、フィルター、ワイルドカード、再帰下降を実践的な例で解説します。

Concept

詳細な説明

JSONPathは、JSONドキュメントから特定の値を抽出するためのクエリ言語で、XMLに対するXPathに相当します。命令的な走査コードを書くことなく、複雑なJSON構造をナビゲートし、位置、名前、または値に基づいて要素を選択するための簡潔な構文を提供します。

基本構文:

JSONドキュメントのルートは $ で表されます。プロパティにはドット記法またはブラケット記法でアクセスします:

  • $.store.bookstore 内の book プロパティにアクセス
  • $['store']['book'] — 同等のブラケット記法
  • $.store.book[0]book arrayの最初の要素
  • $.store.book[-1] — arrayの最後の要素(一部の実装)

主要な演算子:

  • $ — ルートobject
  • . — 子演算子(ドット記法)
  • [] — 子演算子(ブラケット記法)またはarrayインデックス
  • * — ワイルドカード、すべてのプロパティまたは要素にマッチ
  • .. — 再帰下降、すべてのレベルを検索
  • [start:end:step] — arrayスライス
  • [?(expression)] — フィルター式

実践的な例:

書店のJSONドキュメントが与えられた場合:

$.store.book[*].author          — すべての書籍のすべての著者
$.store.book[?(@.price < 10)]   — $10未満の書籍
$..author                       — ドキュメント内のすべての著者
$.store.book[0,1]               — 最初の2冊
$.store.book[-2:]               — 最後の2冊

フィルター式:

フィルターは @ を使用して現在の要素を参照します:

  • [?(@.price > 20)] — priceが20を超える要素
  • [?(@.category == 'fiction')] — カテゴリにマッチする要素
  • [?(@.isbn)]isbn プロパティを持つ要素

実装の状況:

JSONPathは正式な標準ではありませんでした(ただしRFC 9535が2024年に公開)。実装は言語によって異なります。最も一般的な実装には、JavaScriptの jsonpath-plusjsonpath、Pythonの jsonpath-ng、Javaの Jayway JsonPath があります。フィルター式、正規表現マッチング、スライス記法のサポートは実装間で異なります。

開発者がよくやるミス:

最大のミスは、すべてのJSONPath実装が同一に動作すると仮定することです。負のarrayインデックス、正規表現フィルター、関数拡張は普遍的にサポートされているわけではありません。もうひとつのミスは、データの選択だけでなくデータの変換にJSONPathを使用しようとすることです。JSONPathはデータを抽出しますが、ソースドキュメントを変更しません。また、JSON Pointer(RFC 6901)とJSONPathを混同する開発者もいます。JSON Pointerは複数のマッチをクエリするのではなく、単一の値を特定するためのよりシンプルな /key/index 構文を使用します。

ベストプラクティス:

本番コードで使用する前に、実際のデータに対してJSONPath式をテストしてください。最大限の移植性のために広くサポートされている演算子($.[]*..)に留めてください。パフォーマンスが重要な場合は、ツリー全体を走査するため大きなドキュメントでの再帰下降(..)を避けてください。複数のマッチをクエリするのではなく特定の単一パスを参照するだけの場合は、JSON Pointer(RFC 6901)を検討してください。

ユースケース

ネストされたループを書く代わりに、JSONPathクエリを使用して深くネストされたJSON APIレスポンスからすべてのエラーメッセージを抽出し、ダッシュボードに表示する。

試してみる — JSON Formatter

フルツールを開く