JSON 工具箱

JSONPath 和 JSON Pointer 該怎麼選

結論:JSON Pointer 是「唯一路徑」,寫法固定、能直接當 key 用;JSONPath 是「查詢語言」,支援通配、遞迴、過濾。選錯的典型症狀是拿 JSONPath 去做設定讀寫,或拿 Pointer 去做批次篩選。

進階約 4 分鐘發佈於 2026-10-30更新於 2026-10-30
JSONPath 與 JSON Pointer 的能力邊界

結論:要讀寫或儲存某一個節點的位址就用 JSON Pointer(例如 /server/cors/0),要按條件撈出一批節點就用 JSONPath;需要持久化的路徑一律存 Pointer,不存表達式。

看你要的是「一個點」還是「一批點」。

一句話區分

JSON Pointer JSONPath
本質 唯一路徑識別 查詢表達式
語法 /a/b/0 $.a.b[0]、$..price
結果 恰好一個節點(或不存在) 零到多個節點
能當鍵存 ✅ 字串即身分 ❌ 表達式,可能匹配多個
標準 RFC 6901 RFC 9535(2024 年才正式發布)

JSON Pointer 長什麼樣

以斜線開頭,每一段是一個層級,陣列用下標:

/server/host            → "127.0.0.1"
/server/cors/0          → "https://a.com"
/                       → 整個文件

鍵名本身含 / 或 ~ 需要轉義:~0 表示 ~,~1 表示 /。它的價值在於確定性與可序列化——路徑本身就是字串,可以存進資料庫、寫進日誌、作為設定項的 key。JSON Patch(RFC 6902)就是靠它定位要改哪個節點。

JSONPath 長什麼樣

以 $ 開頭表示根,支援通配與過濾:

$.store.book[*].author            → 所有作者
$..price                          → 遞迴找所有 price
$.store.book[?(@.price < 10)]     → 價格低於 10 的書

它更像 SQL 的 WHERE,回傳的是集合。同一個表達式在不同資料上可能匹配 0 個、1 個或 100 個節點。

選錯的兩種典型症狀

拿 JSONPath 當設定項 key。 設定系統裡存 $.server.port,某天結構變成陣列,這個表達式可能匹配到多個埠,改值邏輯就不知道改哪個。這種場景必須用 Pointer。

拿 Pointer 做篩選。 想找「所有 price 小於 10 的節點」,Pointer 做不到——它只能按固定路徑走。硬寫迴圈走訪,等於自己實作一個殘缺的 JSONPath。

實際專案裡的分工

  • 讀設定、改欄位、做 Patch:用 Pointer,路徑固定,可稽核
  • 資料探索、批次擷取、報表取數:用 JSONPath,表達力優先
  • 需要儲存的路徑:一律用 Pointer,別存表達式

常見問題

JSON Pointer 和 JSONPath 該怎麼選?

看你要的是「一個點」還是「一批點」。要精確讀寫某個節點、並希望這個路徑能當鍵存起來,用 JSON Pointer,寫法唯一,例如 /server/cors/0。要按條件撈出一批節點,用 JSONPath,例如 $.store.book[?(@.price < 10)]。

為什麼不能把 JSONPath 表達式當設定項的 key?

因為表達式可能匹配多個節點。設定系統裡存 $.server.port,某天結構變成陣列,這個表達式就會匹配到多個埠,改值邏輯無法判斷該改哪一個。需要持久化、可稽核的定位必須用 Pointer。

能否用 JSON Pointer 做條件篩選?

不能。Pointer 只能按固定路徑走,不知道哪些節點存在,所以「找出所有 price 小於 10 的節點」這類篩選它做不到。硬寫迴圈走訪,等於自己實作一個殘缺的 JSONPath。

延伸閱讀