初めて重要な JSONPath 式を書いたとき、それが機能する前に 3 回間違えましたが、構成していた API ゲートウェイが目的のフィールドの代わりに空のポリシーを返したために、それが間違っているとはまったくわかりませんでした フィードバックループはありませんでした 式を編集して再デプロイして待機します JSONPath テスターを別のタブで開いたままにし始めたら、その同じ作業を午後ではなく 2 分間使用する方法について書かれています JSONPath テスター Toolz.dev では、構文が実際に何をするか、式を作成する小さなトラップは、一致するはずだと確信していたときに何も返しません。
tl;dr: JSONPath は JSON のクエリ言語であり、XPath が XML の場合と同じです。 JSONPath テスターは、次のような式を評価します
$.store.book[*].authorドキュメントに対して、一致するすべての値とそのパスを返します。 The JSONPath テスター これは完全にブラウザで実行され、ワイルドカード、再帰降下、スライス、ユニオン、フィルター式がサポートされているため、コードに貼り付ける前に実際のデータに対してクエリを構築してデバッグできます。
JSONPathとは?
JSONPath は、JSON ドキュメントの一部を選択するためのコンパクトな構文です。データを通るルートを記述する短いパスを記述し、それを評価すると、そのルートでの値が返されます。このアイデアは、 ステファン ゲスナー' s 2007年の提案、XMLをクエリした人なら誰でもくつろげるように、意図的にXPathをミラーリングした。 何年もの間、正式な仕様はなく、その記事とほぼ同意した一連の実装だけがあり、2024 年初めにIETFが公開した RFC 9535 文法を正確に特定するため.
JSONPath に会う頻度は予想以上に多いです。 postman や Karate などの API テストツール、Kubernetes のセレクター言語です kubectl 出力フォーマット、AWS CloudWatch および Step Functions、ログ プロセッサ、および数十のローコード プラットフォームで、ユーザーがコードを記述せずに Webhook ペイロードから 1 つのフィールドを引き出す必要がある場合、それを学習すると、それらすべてに返済されます。
メンタルモデルは単純です.JSON文書は木です.オブジェクトには枝の名前が付けられ,配列には枝の番号が付けられ,葉はスカラー値です.JSONPath式はその木を歩くための方向性のセットであり,その結果はあなたが着地したすべての葉または部分木になります.強力になるのは,単一の式が一度に多くの場所に着地できることです.
JSONPathテスターは実際に何をしますか?
テスターは JSON と式という 2 つの入力を受け取り、式が選択したすべてのノードを表示します。それは当然のことのように聞こえますが、値はフィードバックにあります。式が何も返さないか、予想以上を返す場合、テスターは推測ゲームを 2 秒のチェックに変えます。これは、どのノードが一致したかを正確に確認し、一度に 1 文字ずつ調整できるためです。
Toolz.dev ではフローが短いです。 json ドキュメントを貼り付けるか、ほとんどの JSONPath チュートリアルが使用しているサンプル ブックストアをロードし、式を入力して評価します。ツールには、一致した各値が実行中のカウントとともにリストされ、3 つのビュー間で出力を切り替えることができます。値は結果だけを JSON 配列として与えます。パスはすべての一致の正規化された場所を与えます。これは、実際に必要な式を発見する最も早い方法です。エントリは両方を一緒に与えるため、パスと値を並べて表示できます。
頭の中で実データについて推論するのではなく、実データに対してテストする理由は、ワイルドからの JSON が例よりも厄介だからです。フィールドは、時にはオブジェクトであり、時には配列です。期待していたキーが半分のレコードにありません。文字列として数値が到着しました。実際のペイロードに対して式を実行すると、展開時ではなく即座に驚きが明らかになります。
配列から項目を選択するにはどうすればよいですか?
配列はほとんどの JSONPath 作業が行われる場所であり、配列に対処するには 4 つの方法があります。
単一のインデックスが 1 つの要素を選択します。 $.store.book[0] 最初の本を返し、JSONPathはほとんどの言語と同様にゼロからカウントされます。 負のインデックスは最後からカウントされますので、 $.store.book[-1] いくつあるかを知る必要なく最後の本を返します。そのネガティブな形式は、ログ内の最新のアイテムやフィード内の最新エントリが必要な場合に本当に役立ちます。
ワイルドカードはすべての要素を選択します。 $.store.book[*] 4 冊すべてを返却します $.store.book[*].author それぞれの author を返し、 author の配列をきれいにします。 wildcard はオブジェクトでも動作します。 where $.store.* キーに関係なく、store オブジェクトのすべての値を返します。
ユニオンは特定のセットを選択します。 $.store.book[0,2] は最初と3 冊目の本を返し、同じコンマ構文が名前でも動作しますので、 $['store']['bicycle'] また、括弧で囲まれたキーを使用すると、ドット形式では対応できないスペースや句読点を含むキーに対応できます。
スライスは範囲を選択し、Python's を借用します start:end:step フォーム. $.store.book[:2] 最初の2 つを取ります、 $.store.book[1:3] は、エンドインデックスが排他的な中間の範囲を取ります、 $.store.book[::2] 2 番目の要素ごとに と を取ります $.store.book[::-1] 配列を反転します スライスは構文の中で最も知られていない部分であり、一度入力すると最も多くのタイピングを保存します。
二重点は何をしますか?
ダブルドットは再帰降下であり、JSONPath をパスではなく検索のように感じさせる機能です。 $..author finds every author どれほど深くネストされていても、ドキュメント内のどこにでもキーを押します $..* はすべてのレベルですべての値を返します.文書の正確な形がわからないとき,または同じフィールドがいくつかの深さで現れるとき,再帰降下はそれらのすべてを1 つの式で見つける.
サンプル書店を考えてみましょう. $..price 4 冊の本の価格と自転車の価格の 5 つの値を返します。これは、すべてのオブジェクトに降りてすべてを集めるためです price 見つけます 平野 $.store.book[*].price 固定ルートを歩くため、4 冊の本の価格のみを返します。これら 2 つの式の違いは、既知の場所で価格を求めることと、どこでも価格を求めることの違いです。
再帰降下は危険になるほど強力です つまりあなたが意図した以上に一致できるという意味です まさにそれがここでテスターが重要な理由です 走って $..name 見慣れないペイロードに対して、ユーザー名、製品名、およびキーを共有しているとは知らなかったファイル名と一致することが判明する可能性があります。出力内のパスを見ると、式に依存する前に式を絞り込むかどうかがわかります。
フィルター式はどのように機能しますか?
フィルターは条件が真である要素のみを保持し、それが書き込まれます [?(...)] と @ 現在の要素を表します。 $.store.book[?(@.price < 10)] 10 個よりも安い本を返します フィルター内では、演算子とのリテラルに対してフィールドを比較できます ==、 !=、 <、 <=、 >、そして >=、フィールドの単なる存在をテストし、条件を組み合わせます && あんど ||。
いくつかの具体例で形状が明確になります:
$.store.book[?(@.category == "fiction")]フィクションのタイトルを選択します。$.store.book[?(@.price < 10 && @.category == "fiction")]安っぽいフィクションに絞り込みます.$.store.book[?(@.isbn)]比較ではなく存在を使用して、ISBN が存在する書籍のみを選択します。$.vals[?(@ > 2)]数値の単純な配列をフィルタリングします@それ自体では要素自体を指します。
最も一般的なフィルタのバグは、型の不一致です。 JSONでは、 "12" あんど 12 は異なる値なので、数値フィールドを引用符で囲まれた数値に、または文字列フィールドを裸の数値に比較するフィルターは、黙って何も一致しません。フィルターが驚いたとき、最初にチェックすべきことは、フィールドとリテラルが同じ型であるかどうかです。実際の値を確認できる実際のデータに対して式をテストすることは、展開に失敗した後ではなく、数秒でそれをキャッチする方法です。
JSONPath 対 JSON ポインタ対 JSON 差分
これら3 つのツールはすべてJSON構造に触れますが、さまざまな質問に答え、間違ったものを選ぶと時間が無駄になります。 以下を比較する方法は次のとおりです:
| 近づく | 答え | マッチ | に最適 |
|---|---|---|---|
| Jsonpath | このクエリを満たすノードはどれですか? | ゼロ、1、または多数 | フィールドの抽出、配列のフィルタリング、未知の形状の探索 |
| JSON ポインタ (RFC 6901) | この正確な場所には何がありますか? | 常に正確に1 つ | JSON スキーマのように、単一の固定フィールドを参照します $ref |
| JSON 差分 | 2 つの文書間で何が変わったのでしょうか? | 一連の変更 | 同じデータの 2 つのバージョンを比較します |
で定義される JSON ポインタ RFC 6901、のようなスラッシュ区切りのパスで1 つの正確な場所に対処します /store/book/0/title、そしてそれは決してワイルドカードやフィルターを使わない 単一のフィールドに明確に名前を付ける必要があるときにそれに手を伸ばす 単一の式がフィールドのセットを選択する必要があるときにJSONPathに手を伸ばす そして、あなたの本当の質問がクエリが選択するものではなく、2 つのペイロード間で何が異なるのかであるとき、a json 差分 は正しいツールです.3 つのうちどれが実際に必要なかを知ることは,戦いの半分です.
なぜ私の表現は結果を返さないのですか?
空の結果はほとんどの場合、いくつかの原因のいずれかから生じます。テスターを使用すると、それらをすぐに除外できます。
1 つ目は構造的な不一致です。 と書きました $.data.items.name いつですか items は配列なので、必要でした $.data.items[*].name ワイルドカード付き. dot フォームはオブジェクトの中に入り,配列は a を持つオブジェクトではありません. name key, だからパスは行き止まりです.出力ビューをパスに切り替えて,式を一度に1 セグメントずつステップすると,マッチングが止まる位置が正確に表示されます.
2 つ目はスペルまたはケーシングエラーです。 JSONキーは大文字と小文字が区別されるので、 $.userId はaにマッチしません userID フィールド、およびキー名の末尾のスペースまたはタイプミスにより、同じサイレント何も生成されません。テスターは式のすぐ隣にドキュメントを表示するため、これらはすぐに見つけることができます。
3 つ目は上で説明したようにフィルター型の不一致で、数値比較が文字列値またはその逆に対して実行されます。4 つ目は、キーが一部の要素にのみ存在する場合、すべての要素に存在すると仮定しています。再帰的降下フィルターと存在フィルターは通常の救済策です。いずれの場合も、修正は式がどのノードに接触するかを監視することで行われます。これはまさにテスターの目的です。
Laravel API、Reactフロントエンド、時折シェルスクリプトの間を移動しながら、私が行っているようにスタック全体にビルドすると、JSONPathが3 つすべてに表示され、データをアップロードしないブラウザベースのテスターが私が最も近くに保持しているツールのより広いキットにこのようなユーティリティがどのように適合するかについて書きました Web 開発者ツールキット、そしてこの種の仕事をクライアント側に保つためのケースは、にあります オンライン ツールのデータ プライバシー ガイド.
これは、JSONワークフローの残りの部分とどのように適合しますか?
JSONPath テスターが開いている唯一のツールであることはほとんどありません。クエリを実行している JSON が縮小されているか、インデントが一貫していない場合は、実行します JSON フォーマッタ まず、式を書いている間に構造を読み取ることができるようにします。フォーマッタとテスタを合わせると、読み取れない API 応答から動作するクエリに移行する方法が決まります。
どのフィールドを気にするかがわかったら、次のステップは多くの場合、フィードを再形成することです。選択した値をスプレッドシートまたは環境ファイルに入力する必要がある場合は、 JSON フラットナー ネストされた構造をドット記法キーに変え、そのパス構文は JSONPath に十分近いため、2 つは互いに補強し合います。 TypeScript でデータの型を構築している場合、 JSON から TypeScript converter はインターフェイスを生成します。形状を読み取るだけでなく検証する必要がある場合は、 JSON スキーマジェネレーター 制約を追加できるスキーマを生成します。 JSONPath は探索ステップです; これらのツールは、私が見つけたものを使って実行するものです。
プライバシーポイントは繰り返す価値がありますなぜならJSONPathの作業は機密データに対して頻繁に起こるからです API応答はトークン、ユーザーレコード、内部IDを運び、それらをサーバーサイドツールに貼り付けることは、他の誰かを信頼することを意味します& #39; sログ。 Toolz.devテスターはブラウザで完全に解析および評価するため、そのどれもがマシンから離れず、ツールはネットワークを切断したまま動作し続けるからです。これは、ステージングペイロードで使用できるツールと、実物で使用できるツールの違いです。
よくある質問
JSONPathは何に使用されますか?
JSONPath は、単一の式を使用して JSON ドキュメントの一部を選択して抽出するために使用されます。これは、API テスト ツール、Kubernetes 出力フォーマット、AWS Step Functions などのクラウド サービス、および多くのローコード プラットフォームのクエリ言語であり、誰かがフィールドを取得したり、プロシージャル コードを記述せずに JSON ペイロードから配列をフィルタリングしたりする必要がある場合に使用されます。
JSONPathで配列のすべての要素を選択するにはどうすればよいですか?
ワイルドカードを使用するので、 $.items[*] items 配列のすべての要素を返します $.items[*].id それぞれの id を返します。 with で index で 1 つの要素を選択することもできます $.items[0]、負のインデックスを持つ最後の要素 $.items[-1]、 のような和集合を持つ集合 $.items[0,2]、またはのようなスライスを持つ範囲 $.items[1:3]。
JSONPathでダブルドットは何を意味するのでしょうか?
二重点は再帰降下であり、任意の深さで検索します。 $..author どれほど深くネストされていても、ドキュメント内のどこにいてもすべての作成者キーを見つけます $..* は、すべてのレベルですべての値を返します。 正確な構造が事前にわからないドキュメントからフィールドを引き出す最速の方法です。
JSONPath ではフィルター式はどのように機能しますか?
フィルター [?(...)] 条件が true の要素のみを保持します @ 現在の要素を参照しています 例えば $.book[?(@.price < 10)] 10 冊より安い本を返品でき、条件を組み合わせることができます && あんど ||、 といった [?(@.price < 10 && @.category == "fiction")]。フィールド' の存在をテストすることもできます [?(@.isbn)]。
JSONPath 式が何も返さないのはなぜですか?
最も一般的な原因は、構造的な不一致と型の不一致の2 つです。各キーが存在し、正確なケーシングで綴られていること、およびデータがオブジェクトではなく配列であるワイルドカードを使用したことを確認します。フィルターでは、"12" と 12 は異なる値であるため、文字列フィールドを引用符で囲まれた値に、数値フィールドを裸の数値に比較することを覚えておいてください。
JSONPathとJSON Pointerの違いは何ですか?
JSON ポインタは /store/book/0/title のように 1 つの正確な場所に対応し、常に 1 つの値を返します。 JSONPath は、単一の式がワイルドカード、再帰的降下、フィルターを通じて一度に多くのノードに一致できるクエリ言語です。 1 つの固定フィールドを参照するにはポインタを使用し、フィールドのセットを選択するかコレクションをフィルタリングするには JSONPath を使用します。
値だけでなく、各マッチのパスを見ることができますか?
はい。出力モードをパスに切り替えて、すべての一致の正規化された位置を取得するか、エントリを切り替えてパスと値を一緒に取得します。実際のパスを確認することは、意図したノードを正確に選択するまで式を改良する最も早い方法であり、再帰降下では特に役立ちます。
テスターを使用するときにJSONがアップロードされていますか?
いいえ ドキュメントが解析され、式がブラウザでJavaScriptで評価されるため、何も送信、ログ、保存されません。クエリを実行している間にネットワーク タブを表示するか、インターネットから切断することで確認できます。ページが読み込まれるとテスターはオフラインで動作し続けるためです。
無料の独自のデータで試してみてください JSONPath テスター。ワイルドカード、再帰降下、スライス、結合、フィルター式をすべてブラウザーで評価し、アップロードされるものは何もありません。



