JSONPath 教學:如何快速擷取巢狀 JSON 欄位(2026 實戰指南)

本文介紹 JSONPath 語法、常用表達式、5 步驟實作工作流程與常見陷阱,幫助前端、測試與後端工程師從複雜 API 回應中快速定位欄位,配合 JSONPath 測試工具在本機瀏覽器驗證。

一份包含 200 行巢狀物件的 API 響應,你要取 user.orders[0].items[*].sku,手寫三層 for 迴圈還是 jq/JSONPath?在聯調、日誌排查和自動化測試裡,後者往往 10 秒出結果。

本文面向前端、測試與後端工程師,系統講解 JSONPath 的原理、基礎語法、5 步實操工作流,以及過濾表示式、無匹配結果等常見陷阱。閱讀完成後,你可以用 JSON 工具箱的 JSONPath 測試功能,在瀏覽器本機驗證表示式——資料不上傳伺服器。

為什麼需要 JSONPath

REST 介面、訊息佇列和配置中心返回的 JSON 越來越深:業務欄位藏在陣列、可選物件和動態鍵名之下。手動展開不僅慢,還容易在重構後漏改斷言路徑。

我們在介面迴歸中遇到過:訂單列表把 items 從物件改成了陣列,測試指令碼仍用 $.order.item.name 取價,CI 綠但線上解析失敗。若先用 JSONPath 在樣例 JSON 上驗證 $.order.items[0].name,這類結構變更會立刻暴露。

JSONPath 是什麼

JSONPath 是用於在 JSON 檔案中定位並提取資料的查詢語言,語法靈感來自 XPath。以 $ 表示根節點,透過點號、方括號和遞迴運算子描述路徑,返回匹配到的值或子樹。

與手動遍歷的核心區別

對比維度JSONPath手寫迴圈 / 逐層取值
表達巢狀路徑✅ 一行表示式❌ 多層 null 判斷
陣列批次提取✅ [*]、過濾表示式⚠️ 需寫 map/filter
臨時除錯 API✅ 貼上即測⚠️ 需寫指令碼或 REPL
複雜業務邏輯⚠️ 適合取值✅ 適合多步計算

基礎語法速查

以下是日常最高頻的寫法,建議收藏並在 JSONPath 測試工具中逐條驗證:

表示式含義示例結果
$.store.book[0].title第一個元素的 title單值
$.store.book[*].title陣列中所有 title陣列
$..price遞迴查詢所有 price陣列
$.store.book[?(@.price < 10)]過濾 price < 10 的物件物件陣列
$.store.book[-1:]最後一本書單物件或陣列

誰適合使用 JSONPath

角色典型場景收益
前端開發聯調時從 mock/真實響應取欄位少寫臨時 console.log 指令碼
測試工程師介面斷言、契約測試斷言路徑清晰、易維護
後端 / SRE日誌 JSON、鏈路欄位提取快速 grep 結構化日誌
資料 / 運維從大配置 JSON 取子樹不必整檔案下載解析

典型使用場景

  • API 聯調:確認 token、pagination、error.code 是否存在
  • 自動化測試:斷言 $.data.list[0].id 等於預期值
  • 日誌分析:從 JSON 日誌提取 traceId、userId
  • 配置審查:從部署 JSON 取出某環境變數塊

實操:5 步提取巢狀欄位

以下工作流基於 JSON 工具箱 JSONPath 測試頁,全程在瀏覽器本機執行。

  1. 複製 JSON:從 Network 面板、日誌或檔案貼上完整響應
  2. 貼上到工具左側 JSON 輸入區
  3. 編寫表示式:從 $ 根節點開始,先寫淺路徑再加深
  4. 點選測試:檢視匹配結果列表與高亮
  5. 固化到程式碼:確認無誤後寫入測試斷言或指令碼

示例資料與表示式

{
  "store": {
    "book": [
      { "title": "Sayings of the Century", "price": 8.95 },
      { "title": "Moby Dick", "price": 8.99 }
    ]
  }
}

推薦練習的表示式:

  • $.store.book[*].title → 兩本書標題
  • $.store.book[?(@.price < 9)] → 價格低於 9 的書
  • $..price → 所有 price 欄位

常見陷阱與最佳實踐

路徑不存在時返回什麼

多數實現返回空結果或 undefined,不會拋錯。測試斷言前務必確認「無匹配」與「值為 null」的區別。

鍵名含特殊字元

鍵名含點號、空格時,使用括號:$["user.name"] 或 $['item-id']。

過濾表示式效能

對超大陣列使用 [?(@....)] 可能較慢。生產指令碼中可先縮小路徑再過濾,或改用程式碼側處理。

JSONPath 與其他方式對比

方式上手速度適合臨時除錯適合 CI 斷言
JSONPath 工具快✅ 推薦⚠️ 需複製到用例
瀏覽器 DevTools快✅ 淺層欄位❌
jq(CLI)中✅✅ 可指令碼化
手寫 JavaScript慢⚠️✅ 靈活

常見問題 FAQ

JSONPath 和 XPath 一樣嗎?

思路類似,但 JSONPath 面向 JSON 結構,不支援 XML 節點軸。表示式以 $ 為根,不支援 // 這種 XML 寫法。

為什麼我的表示式沒有匹配結果?

常見原因:路徑拼寫錯誤、陣列下標越界、欄位已改名、或用了不支援的擴充套件語法。建議從 $ 逐段加深測試。

可以一次取出多個不同路徑嗎?

標準 JSONPath 一次表示式對應一條路徑。多個欄位需多條表示式,或在應用層組合結果。

JSON 工具箱支援哪些 JSONPath 特性?

支援常見路徑、萬用字元 [*]、遞迴 .. 及基礎過濾 [?(@.field)]。具體以工具頁測試結果為準。

資料會上傳到伺服器嗎?

不會。JSON 工具箱純前端執行,JSON 與表示式均在本機瀏覽器中處理。

JSONPath 和 JSON Schema 有什麼區別?

JSONPath 用於提取/定位資料;JSON Schema 用於校驗整體結構是否符合約定。兩者常配合使用。

總結與下一步

面對深層巢狀 JSON,JSONPath 是最高效的「定位針」。核心要點:從 $ 根節點逐段驗證 → 在工具裡先測通再寫斷言 → 結構變更時優先檢查路徑是否仍有效。

建議下次聯調時把介面樣例儲存為 fixture,用 JSONPath 列出關鍵欄位路徑,並寫入測試用例,減少上線後的靜默失敗。