§

測試 JSONPath 表達式

輸出格式:
JSONPath 快速參考
Token Meaning
$文件的根元素
@目前元素(用於篩選表達式內部)
.子成員運算子:選取具名子項
..遞迴下降:搜尋所有後代
*萬用字元:匹配任何元素或屬性
[*]陣列的所有項目
[n]索引 n 處的陣列元素(從零開始)
[start:end]從 start 到 end(不含)的陣列切片
[?(@.x)]篩選:屬性 x 存在的項目
[?(@.x==1)]篩選:屬性 x 等於 1 的項目
[(@.length-1)]腳本表達式:陣列的最後一個元素

JSONPath 在任何需要針對實際 payload 驗證 API 合約的場合都會出現。撰寫 Postman 迴歸測試套件的台灣金融科技團隊,在 Test 分頁中以 JSONPath 斷言回應欄位;k6 負載測試腳本以 jsonpath() 從 API 回應中取出值,在 check() 區塊中驗證 SLA 門檻;SRE 值班手冊使用 [?(@.status=="error")] 這樣的篩選表達式切片 JSON 日誌。在瀏覽器分頁中執行這些表達式,可讓自有夾具 payload、客戶個人資料和預發布 API 回應不離開裝置。

什麼是 JSONPath?

JSONPath 是 JSON 文件的查詢語言,相當於 XML 的 XPath 的 JSON 版本。Stefan Goessner 於 2007 年提出,作為在不撰寫解析器的情況下指向 JSON 樹中節點的簡短可讀方式。表達式以根選擇器 $ 開頭,並串接屬性存取器、陣列下標、萬用字元、遞迴下降和篩選條件,直到選取出所需節點。2024 年 IETF 發布了 RFC 9535 以標準化在各實作之間出現分歧的語法;此測試器基於 jsonpath-plus,一個廣泛使用的 JavaScript 實作,涵蓋 Goessner 草案、大部分 RFC 9535,以及額外的擴充運算子。

JSONPath 的運作原理

JSONPath 表達式從左至右讀取,逐步走訪 JSON 文件。每個步驟取上一步存活的節點集合並進一步縮小。完整的評估流程:

  1. 以根選擇器 $ 定錨。每個表達式都從這裡開始,指向頂層值,不論它是物件還是陣列。沒有前導 $ 的裸屬性名稱不是有效的 JSONPath。
  2. 使用點記法($.store.book)或括號記法($['store']['book'])走訪子成員。當鍵包含空格、連字號或任何非有效識別碼的字元時,必須使用括號記法。
  3. 使用遞迴下降運算子 .. 一次搜尋每一層級。表達式 $..author 會收集樹中任何深度的每個 author 值。這是 JMESPath 沒有的運算子。
  4. 以索引選取陣列元素([0]、jsonpath-plus 中以 [-1] 取最後一個),以 [start:end] 記法切片([0:3] 返回前三個),或以萬用字元 [*] 取得所有元素。
  5. 使用 [?(...)] 內的謂詞篩選元素。謂詞內的 @ 指向目前元素,因此 [?(@.price<10)] 只保留 price 欄位小於 10 的項目。篩選器與路徑的其餘部分組合使用,因此你可以篩選後再下降,或下降後再篩選。
  6. 選擇輸出格式。返回比對到的資料本身。路徑返回每個比對項目的 JSONPath,讓你看到引擎解析的結果。指標返回每個比對項目等效的 RFC 6901 JSON 指標,在下游使用者是 JSON Patch 或 JSON Schema 驗證器時很有用。

為何使用此 JSONPath 測試器?

  • 你的 JSON 不會離開瀏覽器。查詢在頁面內執行,因此正式環境夾具、客戶個人資料和預發布 API 回應都留在你的機器上。
  • 引擎是 jsonpath-plus 9.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 在 InputPathResultPathParameters 中評估 JSONPath,以在狀態之間重塑事件 payload。Argo Workflows 在 withParam 中使用 JSONPath 對陣列進行任務展開。Kubernetes 的 kubectl -o jsonpath 使用相同語法從叢集物件中提取欄位。

操作範例

Goessner 的標準夾具是書店文件,包含四本書,每本書都有 categoryauthortitleprice。針對該夾具,表達式 $.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 訊息中。