JSONPath 詳解:查詢你的 JSON
JSONPath 語法——根節點、子節點、遞迴下降、切片、過濾——並對照 jq 與 JMESPath,附實際範例查詢。
JSONPath 對 JSON 就像 XPath 對 XML:一套小型表達式語言,用來從文件
中挑出值。它在 2024 年由 RFC 9535 標準化,並獲所有像樣的 JSON 工具
支援。若你曾經想說「給我所有 status: shipped 且金額 > 100 的訂單」,
JSONPath 就是最短的路徑。
JSONPath 是什麼
JSONPath 表達式是一段字串,描述文件中一組位置的集合。求值器會走訪 文件,回傳符合的值(或路徑、或兩者)。文法小到可以背下來——根、 子、遞迴下降、索引、切片、過濾。
下文皆以這份範本查詢:
{
"store": {
"books": [
{ "title": "Pragmatic Programmer", "price": 30, "tags": ["dev"] },
{ "title": "Designing Data-Intensive Apps", "price": 45, "tags": ["dev", "data"] },
{ "title": "The Art of Travel", "price": 12, "tags": ["essays"] }
],
"bicycle": { "color": "red", "price": 199 }
}
}
根、子、遞迴下降
三個運算子撐起大部分工作:
$——文件根。.name或["name"]——子節點存取,兩者等價;中括號形式可放含特殊字元的鍵。..name——遞迴下降,匹配任何深度的name。
| 表達式 | 結果 |
|---|---|
$ | 整份文件 |
$.store.bicycle | { "color": "red", "price": 199 } |
$["store"]["bicycle"] | 同上 |
$..price | [30, 45, 12, 199]——文件中所有 price |
$.store..title | 三本書的書名 |
遞迴下降是最實用的運算子。當你不知道確切路徑,$..fieldname 會找出
所有出現位置。
陣列索引、切片與萬用字元
陣列以中括號表示:
[0]、[-1]——索引(負數從尾端算)。[0, 2]——多重索引。[1:3]——切片(Python 風格,半開區間)。[*]——萬用字元,每個元素。
| 表達式 | 結果 |
|---|---|
$.store.books[0] | 第一本書物件 |
$.store.books[-1].title | "The Art of Travel" |
$.store.books[0:2] | 前兩本書 |
$.store.books[*].title | 三本書名 |
$.store.books[*].tags[*] | ["dev", "dev", "data", "essays"] |
* 也可用於物件:$.store.* 回傳 store 底下的每個值。
過濾表達式
過濾器是陣列元素的述詞,語法為 [?expression],@ 指當前元素。
| 表達式 | 結果 |
|---|---|
$.store.books[?(@.price < 20)] | [{ "title": "The Art of Travel", ... }] |
$.store.books[?(@.price >= 30)].title | 前兩本書名 |
$.store.books[?(@.tags.contains("data"))].title | ["Designing Data-Intensive Apps"](取決於實作) |
$..[?(@.color == "red")] | [{ "color": "red", "price": 199 }] |
過濾器支援的運算子:比較(==、!=、<、<=、>、>=)、
布林(&&、||、!)、存在性(@.name 為真當該鍵存在)。
某些實作會額外支援 regex(=~)或字串函式(contains、match、
length)——非標準,請查實作。
常用配方
- 依 id 找紀錄——
$.users[?(@.id == "user_123")]。 - 抽出每筆紀錄的某欄位——
$.users[*].email。 - 找所有
error——$..error。 - 前 N 筆——
$.items[:10]。 - 最後一筆——
$.items[-1]。 - 頂層所有鍵——
$.*(物件)或$[*](陣列)。
探索性工作時,JSON Viewer 可讓你點擊節點並 複製到該節點的 JSONPath,比盲打表達式快得多。
JSONPath、jq、JMESPath
三種查詢語言功能重疊:
- JSONPath——XPath 風格,由 RFC 9535 標準化。最適合「找出」值,轉換能力有限。
jq——Turing 完備的程式語言,最適合在 shell pipeline 中「轉換」JSON。filter、map/reduce、字串運算、算術一應俱全,是必備的 CLI 工具。- JMESPath——AWS 的查詢語言,每個 AWS CLI 指令的
--query都用它。能力近似 JSONPath,多了投影與 multi-select。
經驗法則:程式碼用 JSONPath、shell 用 jq、已在 AWS 生態裡就用 JMESPath。
動手試試
開啟 JSON Viewer,貼上 payload,點選任一節點 就會複製到該節點的 JSONPath。隨手過濾可在搜尋框輸入表達式。
延伸閱讀
- 處理大型 JSON 檔案——JSONPath 在不適合整批載入的大型文件上特別有用。
- 比對兩份 JSON 檔案——把 diff 指向 JSONPath 查詢的結果,聚焦在單一子樹。