什麼是 JSONPath?
JSONPath 是 JSON 文件的查詢語言,相當於 XML 的 XPath 的 JSON 版本。Stefan Goessner 於 2007 年提出,作為在不撰寫解析器的情況下指向 JSON 樹中節點的簡短可讀方式。表達式以根選擇器 $ 開頭,並串接屬性存取器、陣列下標、萬用字元、遞迴下降和篩選條件,直到選取出所需節點。2024 年 IETF 發布了 RFC 9535 以標準化在各實作之間出現分歧的語法;此測試器基於 jsonpath-plus,一個廣泛使用的 JavaScript 實作,涵蓋 Goessner 草案、大部分 RFC 9535,以及額外的擴充運算子。
JSONPath 的運作原理
JSONPath 表達式從左至右讀取,逐步走訪 JSON 文件。每個步驟取上一步存活的節點集合並進一步縮小。完整的評估流程:
- 以根選擇器
$定錨。每個表達式都從這裡開始,指向頂層值,不論它是物件還是陣列。沒有前導$的裸屬性名稱不是有效的 JSONPath。 - 使用點記法(
$.store.book)或括號記法($['store']['book'])走訪子成員。當鍵包含空格、連字號或任何非有效識別碼的字元時,必須使用括號記法。 - 使用遞迴下降運算子
..一次搜尋每一層級。表達式$..author會收集樹中任何深度的每個author值。這是 JMESPath 沒有的運算子。 - 以索引選取陣列元素(
[0]、jsonpath-plus 中以[-1]取最後一個),以[start:end]記法切片([0:3]返回前三個),或以萬用字元[*]取得所有元素。 - 使用
[?(...)]內的謂詞篩選元素。謂詞內的@指向目前元素,因此[?(@.price<10)]只保留price欄位小於 10 的項目。篩選器與路徑的其餘部分組合使用,因此你可以篩選後再下降,或下降後再篩選。 - 選擇輸出格式。值返回比對到的資料本身。路徑返回每個比對項目的 JSONPath,讓你看到引擎解析的結果。指標返回每個比對項目等效的 RFC 6901 JSON 指標,在下游使用者是 JSON Patch 或 JSON Schema 驗證器時很有用。
為何使用此 JSONPath 測試器?
- 你的 JSON 不會離開瀏覽器。查詢在頁面內執行,因此正式環境夾具、客戶個人資料和預發布 API 回應都留在你的機器上。
- 引擎是
jsonpath-plus9.x——支撐許多正式環境測試套件和 CI 斷言的同款函式庫。你在此看到的結果與你的建置流程看到的結果一致。 - 三種輸出模式涵蓋常見的下游使用者:原始值用於複製貼上,路徑用於除錯引擎的解析,RFC 6901 指標用於 JSON Patch 和 JSON Schema 工作流程。
- 篩選表達式以
preventEval: true執行,因此貼上的查詢無法對宿主頁面執行任意 JavaScript。當表達式來自 Slack 訊息、Jira 工單或同事的剪貼簿時,這一點尤為重要。
JSONPath 的常見應用場景
JSONPath 出現在任何需要從 JSON payload 中提取欄位而無需手寫遞迴下降的程式碼中:
- Postman 測試:Postman 的 Tests 分頁公開了
pm.response.json()以及 JSONPath 風格的存取,用於斷言。團隊撰寫像$.data.user.email這樣的單一表達式,從回應中提取欄位並在 CI 中斷言。 - k6 負載測試:k6 腳本在
check()區塊內呼叫jsonpath()從回應本文中提取值並斷言 SLA 門檻。在 Postman 中驗證合約的同一表達式也可以在 k6 的負載測試中設置門檻。 - 資料轉換 JSON DSL:AWS Step Functions 在
InputPath、ResultPath和Parameters中評估 JSONPath,以在狀態之間重塑事件 payload。Argo Workflows 在withParam中使用 JSONPath 對陣列進行任務展開。Kubernetes 的kubectl -o jsonpath使用相同語法從叢集物件中提取欄位。
操作範例
Goessner 的標準夾具是書店文件,包含四本書,每本書都有 category、author、title 和 price。針對該夾具,表達式 $.store.book[?(@.price<10)].title 分三步執行。首先,$.store.book 解析為所有四本書的陣列。接著,篩選器 [?(@.price<10)] 只保留定價低於 10 的那本書(8.95 的那本)。最後,.title 提取該書的標題。結果為 ["Sayings of the Century"]。切換至路徑返回 ["$['store']['book'][0]['title']"],指標返回 ["/store/book/0/title"]。
在此原型化你的表達式,然後直接放入 Postman、k6、kubectl 或 Step Functions 狀態機。貼上、查詢、複製。任何資料都不會跨越網路。
什麼是 JSONPath?
JSONPath 是 JSON 文件的查詢語言,類似於 XML 的 XPath。由 Stefan Goessner 於 2007 年提出,並於 2024 年由 IETF 標準化為 RFC 9535。它使用以 $(文件根)開頭的緊湊表達式語法,支援點記法、陣列下標、萬用字元、切片、遞迴下降(..)和篩選表達式([?(...)])來選取 JSON 樹中的節點。
JSONPath 與 JMESPath 或 jq 有何不同?
三者都查詢 JSON,但語法和目標不同。JMESPath 是 AWS CLI/SDK 標準:比 JSONPath 更嚴格,沒有遞迴下降,為可預測的無副作用投影而設計。jq 是圖靈完備的腳本語言,不僅能查詢 JSON,還能轉換、聚合和串流。JSONPath 介於兩者之間:因遞迴下降和篩選器而比 JMESPath 更具表達力,比 jq 更輕量,並且是通用測試工具(Postman、Playwright、REST Assured、kubectl、Step Functions)中支援最廣泛的語法。此測試器實作 JSONPath。
此測試器使用哪種方言?
此測試器執行 jsonpath-plus 9.x。該函式庫實作 Goessner 2007 規格,涵蓋大部分 RFC 9535,並新增了擴充運算子,如型別檢查(@.string()、@.number()、@.boolean())和父節點導航(^)。preventEval: true 標誌始終設定,因此篩選謂詞透過安全直譯器而非 JavaScript 的 eval() 內建函式執行。貼上的查詢無法對此頁面執行任意程式碼。
我可以複製個別比對值嗎?
可以。複製到剪貼簿按鈕會將完整結果區塊複製為 JSON 陣列。若要取得單一值,請將輸出模式切換為值,然後在結果文字區域中選取你想要的那一行,並使用瀏覽器的標準複製快捷鍵(Ctrl/Cmd + C)。輸出是純 JSON 文字,可以乾淨地貼入程式碼編輯器、終端機、Postman 測試或 Slack 訊息中。