JSONPath 查詢指南:從 JSON 中精準提取巢狀資料
JSON(更新於 2026年6月18日)
JSONPath 是什麼
JSONPath 是一種 JSON 資料查詢語言,類似 XPath 之於 XML,能從複雜巢狀 JSON 中精準提取資料:
{
"store": {
"books": [
{"title": "三體", "price": 68},
{"title": "活著", "price": 45},
{"title": "百年孤獨", "price": 55}
]
}
}
使用 $.store.books[*].title 即可提取所有書名:["三體", "活著", "百年孤獨"]
基礎語法速查
| 語法 | 含義 | 範例 |
|---|---|---|
$ |
根節點 | $ |
. |
子節點 | $.store |
[] |
陣列索引或子節點 | $[0]、$['key'] |
* |
萬用字元,所有元素 | $.store.* |
.. |
遞迴下降,所有層級 | $..title |
[start:end] |
陣列切片 | $[0:2] |
[?(expr)] |
過濾表達式 | $[?(@.price > 50)] |
逐個語法詳解
根節點 $
$ 代表 JSON 根,所有路徑都從 $ 開始:
$ → 整個 JSON
$.store → store 物件
子節點存取 .
用 . 或 [] 存取子節點:
$.store.books → books 陣列
$.store['books'] → 等價寫法,鍵名含特殊字元時必須用此形式
陣列索引 []
$.store.books[0] → 第一本書
$.store.books[-1] → 最後一本書
$.store.books[0:2] → 前兩本書(切片)
萬用字元 *
$.store.books[*] → 所有書
$.store.books[*].title → 所有書名
遞迴下降 ..
.. 搜尋所有層級,無需知道完整路徑:
$..title → 所有層級的 title 欄位
$..price → 所有層級的 price 欄位
在深度巢狀的 API 回應中,
..特別好用。
過濾表達式 ?()
過濾是 JSONPath 最強大的功能:
比較運算子
| 運算子 | 含義 | 範例 |
|---|---|---|
== |
等於 | $[?(@.price == 45)] |
!= |
不等於 | $[?(@.price != 45)] |
> |
大於 | $[?(@.price > 50)] |
< |
小於 | $[?(@.price < 50)] |
>= |
大於等於 | $[?(@.price >= 55)] |
邏輯運算子
$[?(@.price > 50 && @.price < 70)] → 價格在 50-70 之間
$[?(@.category == 'fiction' || @.price < 40)] → 虛構類或價格低於 40
字串匹配
$[?(@.title =~ /三.*/)] → 標題以「三」開頭
使用 JSONPath 工具
第一步:開啟工具
造訪 JSONPath 工具,進入查詢介面。
第二步:輸入 JSON 資料
將 API 回應或 JSON 資料貼到輸入框。可先用 JSON 格式化 美化資料。
第三步:編寫 JSONPath 表達式
在查詢框中輸入表達式,如 $.data.users[*].name。
第四步:檢視提取結果
工具即時顯示匹配結果,支援高亮定位匹配節點在原文中的位置。
實戰:從 API 回應提取資料
GitHub API 範例
{
"items": [
{"full_name": "vuejs/vue", "stargazers_count": 45000, "language": "TypeScript"},
{"full_name": "facebook/react", "stargazers_count": 42000, "language": "JavaScript"}
]
}
$.items[*].full_name → 所有倉庫名稱
$.items[?(@.stargazers_count > 43000)].full_name → Star > 43000 的倉庫名稱
分頁資料提取
$.data.list[*].id → 目前頁所有 ID
$.pagination.next_cursor → 下一頁游標
JSONPath vs JMESPath
| 對比項 | JSONPath | JMESPath |
|---|---|---|
| 語法風格 | 類 XPath | 類 SQL/管道 |
| 遞迴搜尋 | .. 原生支援 |
需顯式遍歷 |
| 過濾語法 | [?(@.x > 1)] |
[?x > 1] |
| 投影/變換 | 不支援 | 支援 [*].{n: name} |
| 多結果排序 | 不保證 | 可排序 |
| 工具 | JSONPath | JMESPath |
簡單提取用 JSONPath,需要變換/投影用 JMESPath。
常見問題
| 問題 | 原因 | 解決 |
|---|---|---|
| 查詢回傳空 | 路徑拼寫錯誤 | 檢查鍵名大小寫 |
| 過濾不生效 | 語法版本差異 | 確認工具支援的語法版本 |
| 陣列越界 | 索引超出範圍 | 使用 [*] 或檢查陣列長度 |
| 遞迴結果太多 | .. 匹配了所有層級 |
縮小範圍或加過濾條件 |
| 特殊字元鍵名報錯 | 鍵名含 . 或 - |
使用 ['key.name'] 括號語法 |
總結
JSONPath 是處理 JSON 資料的利器,掌握 $、.、[]、*、..、?() 六大語法,就能從任意巢狀 JSON 中精準提取資料。JSONPath 工具 提供即時查詢和高亮定位,配合 JMESPath 和 JSON 格式化 建構完整的 JSON 資料處理工作流。
#JSONPath#数据查询#嵌套#过滤#提取