ToolDeck

JSONPath テスター

JSONデータに対してJSONPath式をテストし、一致した結果を確認できます

サンプルを試す

JSON入力

結果

ローカルで実行 · シークレットの貼り付けも安全
結果がここに表示されます…

JSONPathとは何か?

JSONPathは、JSONドキュメントから値を抽出するためのクエリ言語です。2007年にStefan GoessnerによってXMLにおけるXPathのアナログとして提案されたJSONPathは、ループや手動のトラバーサルコードを書くことなく、$.store.book[*].authorのような式でbookの配列内のすべてのauthorフィールドを選択できます。この言語は2024年2月にIETFによってRFC 9535として標準化されました。

JSONPath式は常にドキュメントのルートを表す$で始まります。そこからセレクターを連結します。オブジェクトキーにはドット記法、配列インデックスにはブラケット記法、すべての子要素にはワイルドカード、そしてネストの各レベルを検索する再帰降下演算子(..)を使用します。[?(@.price < 10)]のようなフィルター式を使えば、値に対して評価した条件に基づいて要素を選択できます。

JSONPathは、PostmanなどのAPIテストツール、DatadogやSplunkなどの可観測性プラットフォーム、Apache NiFiなどのワークフローエンジン、さらにJavaScript・Python・Go・Java・C#にわたるプログラミングライブラリで使用されています。コードや設定ファイルに組み込む前に実際のデータに対して式をテストすることで、JSON構造が想定と一致しない場合のサイレントエラーを防ぐことができます。

このJSONPathテスターを使う理由

JSONPath式を手書きするとエラーが発生しやすいです。ドットの欠落、ブラケットの種類の誤り、フィルター構文の間違いにより、エラーメッセージなしで空の結果が返されることがあります。このツールは、あなたの式が何に一致するかについて即座に視覚的フィードバックを提供します。

即座に結果を確認
JSONを貼り付け、式を入力すると、一致した値がリアルタイムで更新されます。クエリを確認するためにスクリプトを実行したりページをリロードしたりする必要はありません。
🔒
プライバシー優先
すべての評価はブラウザ上で実行されます。JSONデータがあなたのマシンから外に出ることはないので、本番APIのレスポンスや認証情報を含む設定ファイルに対しても安全にテストできます。
📋
結果を直接コピー
一致した出力をワンクリックでJSONとしてコピーできます。再フォーマットなしで、テストアサーション、ドキュメント、またはAPIレスポンス例に貼り付けることができます。
🛠️
セットアップ不要
インストールするnpmパッケージも、作成するPython仮想環境も不要です。ページを開き、データを貼り付け、クエリを開始するだけです。ブラウザがあればどのデバイスでも動作します。

JSONPathのユースケース

フロントエンド開発
ReactのstateやVueのcomputedプロパティに接続する前に、APIレスポンスから必要な正確なネストされた値を抽出します。実際のAPIペイロードに対してパス式を先にテストしましょう。
バックエンドAPIテスト
PostmanとREST-assuredはJSONPathを使ってレスポンスボディをアサートします。テストスクリプトにコピーする前にここでアサーション式を構築・検証することで、デバッグサイクルを削減できます。
DevOps設定
Kubernetesのカスタムリソース定義、AWS Step Functions、TerraformのデータソースはJSONPath式を使ってJSONの出力から値を抽出します。デプロイ前にパスを検証してください。
QAテスト自動化
コントラクトテストや統合テストのためにJSONPathベースのアサーションを記述します。JSONの構造にオプションまたはnull許容フィールドがある場合でも、式が期待値と正しく一致することを確認できます。
データパイプラインの抽出
Apache NiFi、Logstash、カスタムETLスクリプトはJSONPathを使って半構造化されたログデータやイベントストリームからフィールドを抽出します。パイプラインのデプロイ前にサンプルペイロードに対して式をテストしてください。
学習と実験
JSONPathを初めて学ぶ学生や開発者は、ローカル環境なしでサンプルJSONに対してさまざまな式を試し、ワイルドカード、再帰降下、フィルターの動作を理解できます。

JSONPath構文リファレンス

RFC 9535は標準のJSONPath構文を定義しています。下の表はほとんどのクエリで使用する演算子を網羅しています。すべての式は$(ルートノード)で始まり、1つ以上のセレクターを連結してドキュメント構造をナビゲートします。

演算子説明
$Root element$.store
.keyChild property$.store.book
[n]Array index (zero-based)$.store.book[0]
[*]All elements in array/object$.store.book[*]
..Recursive descent$..author
[start:end]Array slice$.store.book[0:2]
[?()]Filter expression$.store.book[?(@.price<10)]
@Current node (inside filter)$.store.book[?(@.isbn)]

JSONPath vs jq vs XPath

JSONPath、jq、XPathはいずれも同じ問題(構造化データのクエリ)を、異なるフォーマットとユースケースに対して解決します。JSONPathはJSONを対象とし、ほとんどの言語でライブラリとして利用可能です。jqは独自のチューリング完全なフィルター言語を持つスタンドアロンのCLIツールです。XPathはXMLを操作し、W3C仕様スタックの一部です。

特徴JSONPathjqXPath
データ形式JSONJSONXML
最初の要素へのアクセス$.store.book[0].store.book[0]/store/book[1]
再帰検索$..price.. | .price?//price
フィルター式[?(@.price<10)]select(.price < 10)[price<10]
仕様RFC 9535stedolan.github.ioW3C XPath 3.1

コード例

一般的な言語とツールでJSONPath式を評価する方法を示します。各例では比較のために同じbookstoreのJSON構造を使用しています。

JavaScript (jsonpath-plus)
import { JSONPath } from 'jsonpath-plus';

const data = {
  store: {
    book: [
      { title: 'Moby Dick', price: 8.99 },
      { title: 'The Great Gatsby', price: 12.99 }
    ]
  }
};

// Get all book titles
JSONPath({ path: '$.store.book[*].title', json: data });
// → ['Moby Dick', 'The Great Gatsby']

// Recursive descent — find every price in the document
JSONPath({ path: '$..price', json: data });
// → [8.99, 12.99]

// Filter — books under $10
JSONPath({ path: '$.store.book[?(@.price < 10)]', json: data });
// → [{ title: 'Moby Dick', price: 8.99 }]
Python (jsonpath-ng)
from jsonpath_ng.ext import parse
import json

data = {
    "store": {
        "book": [
            {"title": "Moby Dick", "price": 8.99},
            {"title": "The Great Gatsby", "price": 12.99}
        ]
    }
}

# Get all book titles
expr = parse("$.store.book[*].title")
titles = [match.value for match in expr.find(data)]
# → ['Moby Dick', 'The Great Gatsby']

# Recursive descent — all prices
expr = parse("$..price")
prices = [match.value for match in expr.find(data)]
# → [8.99, 12.99]

# Filter — books under $10
expr = parse("$.store.book[?price < 10]")
cheap = [match.value for match in expr.find(data)]
# → [{"title": "Moby Dick", "price": 8.99}]
Go (ohler55/ojg)
package main

import (
    "fmt"
    "github.com/ohler55/ojg/jp"
    "github.com/ohler55/ojg/oj"
)

func main() {
    src := `{
        "store": {
            "book": [
                {"title": "Moby Dick", "price": 8.99},
                {"title": "The Great Gatsby", "price": 12.99}
            ]
        }
    }`

    obj, _ := oj.ParseString(src)

    // Get all book titles
    expr, _ := jp.ParseString("$.store.book[*].title")
    results := expr.Get(obj)
    fmt.Println(results)
    // → [Moby Dick The Great Gatsby]

    // Recursive descent — all prices
    expr2, _ := jp.ParseString("$..price")
    fmt.Println(expr2.Get(obj))
    // → [8.99 12.99]
}
CLI (jq alternative syntax)
# jq uses its own syntax, not JSONPath, but solves the same problem.
# Mapping common JSONPath patterns to jq:

# $.store.book[*].title → get all titles
echo '{"store":{"book":[{"title":"Moby Dick"},{"title":"Gatsby"}]}}' | \
  jq '.store.book[].title'
# → "Moby Dick"
# → "Gatsby"

# $..price → recursive descent for "price" keys
echo '{"a":{"price":1},"b":{"price":2}}' | \
  jq '.. | .price? // empty'
# → 1
# → 2

# Filter: books where price < 10
echo '{"store":{"book":[{"title":"A","price":8},{"title":"B","price":12}]}}' | \
  jq '.store.book[] | select(.price < 10)'
# → {"title":"A","price":8}

よくある質問

JSONPathとjqの違いは何ですか?
JSONPathは、ライブラリとしてアプリケーションに組み込まれるように設計されたクエリ言語です。パス式を使ってJSONドキュメントから一致する値を返します。jqは条件分岐、関数、文字列補間を含むJSONを変換するための完全なプログラミング言語を持つスタンドアロンのコマンドラインツールです。コードやPostmanのようなツールにクエリを埋め込む必要がある場合はJSONPathを使用し、アドホックなコマンドラインのデータ変換にはjqを使用してください。
JSONPathは公式標準ですか?
はい。IETFは2024年2月にRFC 9535(「JSONPath: Query Expressions for JSON」)を公開しました。それ以前は、JSONPathは2007年のStefan Goessnerによる非公式の仕様としてのみ存在しており、実装間での不整合を招いていました。RFC 9535は相互運用性のための構文、セマンティクス、および正規化フォーマットを定義しています。
JSONPathの再帰降下(..)はどのように機能しますか?
再帰降下演算子(..)は、その後に続くキーをJSONドキュメントのすべてのレベルで検索します。例えば、$..priceはどれだけ深くネストされているかに関わらず、"price"キーに関連するすべての値を返します。これはマッチするノードを収集する深さ優先トラバーサルに相当します。大きなドキュメントでは、再帰降下は多くの結果を返す可能性があり、直接パスよりも遅くなる場合があることに注意してください。
JSONPathはJSONデータを変更できますか?
いいえ。JSONPathは読み取り専用のクエリ言語です。値を選択して返すことはできますが、ノードの挿入、更新、削除はできません。JSONPath式に基づいてJSONを変更するには、クエリの後にプログラミング言語のJSON操作関数を使用する必要があります。PythonのjsonPath-ngのような一部のライブラリはマッチオブジェクトにset()メソッドを提供していますが、これはライブラリの拡張であり、JSONPath仕様の一部ではありません。
JSONPathフィルター式における@記号の意味は何ですか?
@記号は、フィルター式で評価されている現在のノードを指します。$.store.book[?(@.price < 10)]において、フィルターはbookの配列の各要素をイテレートし、@は各bookオブジェクトを順番に表します。@.priceは現在のbookのpriceフィールドにアクセスします。@がないと、フィルターはどのノードのプロパティをチェックするかがわかりません。
JSONPathで特殊文字やスペースを含むキーをどのように扱いますか?
引用符付きのブラケット記法を使用してください: $['store']['book title']。ブラケット記法は、ドット、スペース、Unicode文字を含むキーなど、あらゆるキーに対して機能します。ドット記法($.store.key)は有効な識別子(文字、数字、アンダースコア)のキーにのみ機能します。RFC 9535は、実装がシングルクォートとダブルクォートの両方のブラケット記法をサポートすることを要求しています。
JSONPath式が空の結果を返すのはなぜですか?
最も一般的な原因は、キー名のタイプミス(JSONPathは大文字小文字を区別する)、特殊文字を含むキーへのドット記法の使用、先頭の$ルートシンボルの欠落、または単一オブジェクトを配列と誤解していることです。JSONをテスターツールに貼り付け、まずより単純な部分式($.storeなど)を試して、セレクターを追加する前にパスの各セグメントが正しく解決されることを確認してください。