このツールの位置づけ
本ツールは,構造化されたJSONデータから「特定のパスにある値を素早く取り出す」ことに特化した,独自の軽量なパス評価エンジンを採用した簡易テスターです.内部的にはJavaScriptによる純粋な読み取り専用のトラバーサルアルゴリズムによって構築されています.そのため,AST(抽象構文木)を厳密に構築するような重厚なパーサーや,RFC 9535(JSONPath規格)の完全準拠プログラム,あるいはC言語由来のjq処理系のWebAssembly移植版といったものではありません.
空文字や単体の . ,あるいは $ はルート要素そのものを表す識別パスとして扱われます.
このような独自の簡易エンジンを採用した理由は,開発者が日々の作業で直面する「深くネストされたAPIレスポンスから,特定の配列だけをさっと確認したい」といったユースケースにおいて,過剰な仕様よりも軽快な動作が求められるためです.入力されたクエリ文字列は,内部で正規化処理を経たのちトークン単位に分割され,指定されたJSONオブジェクトの階層をトップダウンで辿っていきます.
なお,極端に巨大なJSONデータを処理する場合は,非同期処理やWeb Worker,タイムアウト監視に対応していない同期的な関数のため,処理完了までメインスレッドを専有する境界があります.また,処理はブラウザのメモリ内で行われますが,通信環境や第三者拡張機能を含むセキュリティ・完全な安全性を保証するものではありません.
あくまで軽量な「簡易抽出シミュレーター」としてご活用ください.
キーと添字
JSONデータの探索において基本となるのが,オブジェクト自身のプロパティ名(キー)や配列のインデックス(添字)を指定したノードの直接抽出です.本ツールの読み取りクエリは,プロトタイプチェーン上の継承プロパティ(inherited properties)の参照を防ぐため,オブジェクト自身のプロパティ(own property)のみを探索対象とします.
これは完全なAST構築や抽象解釈を行うものではなく,プロパティルックアップ時の安全な参照制限として機能します.本ツールでは,JSONPathの起点である $ と,jqの起点である . の両方の記法からクエリを開始できます.短縮記法であるドット記法(例: $.name や .name)では標準的なASCII識別子に加えて非ASCII文字も使用可能ですが,記号等の特殊な文字を含むキーには引用符付きブラケット記法を使用します.
ドット記法を用いて $.store.book や .store.book のように記述することで,階層を深く掘り進むことが可能です.さらに,JSONのキー名にドットやスペース,あるいは閉じ括弧(])が含まれている境界ケースに対処するため,引用符付きのブラケット記法(シングルクォーテーションまたはダブルクォーテーション)をサポートしています.
内部の字句スキャナにより,エスケープシーケンスやUnicodeエスケープ,キー内部のドットや角括弧も単一のプロパティ名として厳密に解釈されます.単一パス指定では該当する値そのものが返却され,合致するノードが存在しない場合はJSONのnullと明確に区別された専用マーカーで通知されます.
また,抽出された true,false,0,空文字,実値としての null はクリップボードへそのまま安全にコピー可能です.
配列要素へのアクセスは,非負の整数値を角括弧で囲むこと(例: [0])で行います.注意点として,正規表現および字句解析においてインデックスは非負の整数のみを正当な指定として扱う仕様であり,末尾から要素を逆算するような負の添字指定やステップ指定には対応していません.
未対応の構文や文法エラーが含まれる場合は,対象ノードの有無にかかわらず即座に構文エラーとして検出されます.また,入力値のパース処理における数値精度は標準的なJavaScript(JSON.parseの通常の倍精度浮動小数点数)に準拠します.リテラルの Infinity や NaN はJSON文法自体に違反するため構文エラーとして拒絶されますが,1e309 のような表記はJSONの文法上は正当な数値構文であるものの,パース結果として Infinity を生成するため,パース後に実施される有限数値チェック(finite check)によって不適格と判定され拒絶されます.
【動作する抽出式の例】
- $.store.bicycle.color (ドット記法による順次アクセス)
- .store.book[0].title (配列の先頭要素へのアクセス)
- $.store.book[0]['category'] (単一引用符を用いたキーアクセス)
- $['item.name[0]'] (ドットや角括弧を含むキーのブラケット指定)
【非対応・エラーとなる抽出式】
- $.store.book[-1] (負の添字指定は未対応のため構文エラーとなります)
- $.store.book[0:10:2] (ステップ指定を含む構文はエラーとなります)
ワイルドカードとスライス
複数要素の一括抽出を可能にするのが,ワイルドカードとスライス記法です.データ構造の途中に存在する配列の全要素に対して処理を行いたい場合や,オブジェクトが持つすべての値を列挙したい場合,ワイルドカード * が活躍します.また,ワイルドカードやスライスなどの複数要素抽出を行った場合,合致した各要素を配列に格納して返却しますが,選択された要素自体が配列であった場合でもその中身を勝手にフラット化(平坦化)せず,元の階層境界を保持したまま出力します.
本ツールは .* と [*] の両方をワイルドカードトークンとして解釈します.評価器がこのトークンに到達すると,現在のノードが配列であれば各要素に対して,オブジェクトであればその直接のプロパティ値すべてに対して反復処理を開始し,クエリの残りのパスを順次適用します.
最終的に合致した複数のノード群は,マッチした値のリスト(配列)として結果出力されます.合致する要素が一つも存在しない場合は,JSONのnull値とは区別された専用の未一致マーカーが表示されます.
また,配列の一部だけを切り出して抽出したい場合には,非負の開始・終了インデックスを指定するスライス記法 [start:end] を利用できます.さらに,開始や終了のインデックスを省略した [:2],[1:],[:] のようなオープンエンドスライスにも対応しています.
省略された場合,開始インデックスは0,終了インデックスは配列の長さ(array.length)として評価され,終了位置のインデックスを含まない(end exclusive)範囲の配列要素を切り出します.負のインデックスや増分を指定するステップ記法([start:end:step])は非対応であり,パースエラーとなります.
【動作する抽出式の例】
- $.store.book[*].author (配列内の全要素から特定のキーの値を抽出)
- .store.book[0:2] (配列の最初から2つの要素を抽出・終端インデックスは除外)
- $.matrix[*] (配列の配列を保持し,内側の配列を勝手に平坦化せずに抽出)
【非対応・エラーとなる抽出式】
- .store.book[0:10:2] (ステップ・増分を伴う高度なスライス記法は構文エラーとなります)
- $.store.book[:-1] (負のインデックスを用いたスライス指定は構文エラーとなります)
再帰探索
JSONデータの階層が非常に深く,目的のプロパティがどの階層に存在するか不定の場合に強力なのが「再帰的降下演算子」です.本ツールは $..key という再帰探索の記法に対応しています.
内部実装において,本機能は文字列の単純な置換フラグ処理ではなく,専用のトークンとして字句解析・構文解析されます.評価エンジンは再帰呼び出しを行うJavaScript関数ではなく,スタックを用いた「反復型の先行順(pre-order)深さ優先探索(DFS)」によって走査を実行します.
探索対象はオブジェクト自身が保持するプロパティ(own properties)に限定され,走査中にターゲットキーと一致する値が見つかるたびに抽出結果へ追加されます.この際,抽出された値が配列であっても自動的に平坦化(flatten)されることはなく,重複する値も除外されずに保持されます.
また,元のデータツリーにおける祖先パスや階層のメタデータは結果に含まれません.一致するノードがゼロ件の場合は,専用のマーカー(空結果を示す識別子)が返却されます.
この仕組みにより,スキーマが不定なJSONから特定のIDや価格データなどを一網打尽にすることが可能です.ただし,あらゆる深さやサイズの入力を無制限に走査できることを普遍的に保証するものではありません.過剰な負荷やクラッシュを防ぐ安全機構として,走査ステップごとに累積最大200,000回のノード走査,または最大20,000件のマッチ件数を超える場合に処理を中断しエラーを返します.
さらに,入力JSON自体の構造制約として,最大階層深度は128,総要素・ノード数は最大100,000件までに制限されています.
【動作する抽出式の例】
- $..price (あらゆる階層から price キーの値をすべて抽出)
- $..details.age (再帰探索で見つけたノード群に対し,さらに子キーの値を抽出)
JSONPathとjqとの差
本ツールは直感的なインターフェースを提供していますが,RFC 9535(JSONPath規格)やjq言語と同一視して使用することはできません.実装範囲を「パスを用いた抽出」のみに絞り込んでいるため,いくつかの決定的な仕様の差が存在します.本ツールは完全な仕様準拠エンジンではなく,安全で予測可能な特定サブセットの実装です.
構文解析においては,先行するノードが存在しない場合であっても,未対応の構文や不正な記述があれば未一致として無視することなく即座に構文エラーを明示します.
最も大きな違いは,「条件フィルター」や「演算式」「パイプ」が存在しない点です.標準的なJSONPathでは [?(@.price < 10)] のような記述で動的に条件判定を行えますが,本ツールのエンジンは比較演算子や論理演算をサポートしません.同様に,jqのパイプ(|)を用いた関数呼び出し(例: length や keys),およびデータの加工・再構築も不可能です.
これらが指定された場合は,パスの誤りとしてエラーが通知されます.
また,複数パスをカンマ区切りで同時に指定するUnion演算子(例: ['key1', 'key2'])や,負のインデックス,ステップ指定スライスにも対応していません.本ツールはあくまで「入力された単一のパス定義に従って,自身のプロパティツリーを厳密に辿る」という責務のみを持ちます.
データのフィルタリングや関数による集計,動的なデータ構造の変換が必要な場合は,専用のjq実行環境やRFC 9535完全準拠のライブラリをご利用ください.
【非対応の抽出式(構文エラーとなります)】
- $.store.book[?(@.price < 10)] (JSONPathの条件フィルター式は構文エラー)
- .store.book[] | select(.price < 10) (jqのパイプおよびselect関数は構文エラー)
- .store.book | {title: .title} (オブジェクトの再構築機能は構文エラー)
- $.store.book['title', 'price'] (複数キーを同時に指定するUnion記法は構文エラー)
APIレスポンス調査の手順
実際のシステム開発において,本ツールをAPIレスポンスの調査やデバッグに活用する実務的な手順を解説します.REST APIやGraphQLから返却される複雑なJSONペイロードの中身を素早く紐解く場面で,この簡易テスターは真価を発揮します.クライアントサイドでの同期的な評価により,入力データとクエリの双方を即座に検証できます.
まず,クリップボードにコピーした生データを解析元テキストエリアに貼り付けます.次に,抽出したいデータ配列のルートを探ります.例えばレスポンスが { "status": 200, "data": { "users": [...] } } という構造であれば,入力欄に $.data.users と打ち込み,配列全体が正しく表示されるかを確認します.
空文字や $ ,あるいは . を指定すれば,ルート要素そのものを確認できます.もしJSONの構文自体が壊れている場合やパスの文法に誤りがある場合は結果出力は行われません.
構造が確認できたら,最初の要素をサンプリングして仕様を把握します($.data.users[0]).配列内のユーザー全員のメールアドレス一覧だけが必要であれば,ワイルドカードを活用して $.data.users[*].email と入力します.階層が深く構造の全容が把握しづらい場合は,反復的な事前順深さ優先走査を行う再帰探索 $..email を指定することで,入れ子になったキーを一括してリストアップできます.
キー名に記号が含まれる場合でも,引用符付きブラケット記法($["user.email"])によって正確に走査可能です.
データのパースからクエリの実行までは,すべてブラウザ上で同期的に実行されます.入力上限1,000,000 UTF-16コード単位,クエリ2,000 UTF-16コード単位,JSON深さ128,パース値100,000件,クエリ128セグメント,探索200,000ノード訪問,20,000マッチ件数,およびシリアライズ前2,000,000 UTF-16コード単位の出力制限が適用されます.
抽出結果はパネルに整形表示され,コピーボタンを押すことで非同期クリップボードAPIを通じて格納されますが,ブラウザ権限で拒否された場合は失敗通知が表示され,元データやクエリを変更すると直前の結果はクリアされます.該当ノードが存在しない「未一致」とデータ自体の「null」は区別して表示されます.
本ツールでの確認後は,最終的な本番仕様に合わせてテスト環境等でも検証を行ってください.