JSONPath 和 JSON Pointer 該怎麼選
結論:JSON Pointer 是「唯一路徑」,寫法固定、能直接當 key 用;JSONPath 是「查詢語言」,支援通配、遞迴、過濾。選錯的典型症狀是拿 JSONPath 去做設定讀寫,或拿 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。