跳至內容

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(=~)或字串函式(containsmatchlength)——非標準,請查實作。

常用配方

  • 依 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。隨手過濾可在搜尋框輸入表達式。

延伸閱讀