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 工具 提供即時查詢和高亮定位,配合 JMESPathJSON 格式化 建構完整的 JSON 資料處理工作流。

#JSONPath#数据查询#嵌套#过滤#提取