使用 JSONPath 表示式查詢和提取 JSON 資料
工具功能
- 進階查詢語法: 支援完整的 JSONPath 語法,包括萬用字元 (*)、遞迴下降 (..)、陣列切片 ([開始:end])、過濾器 ([?(@.price < 10)])和多路徑選擇器
- 路徑表示式範本: 預先建立的常用查詢範本:根存取 ($)、直接子節點 ($.金鑰)、陣列項 ($.arr[*])、過濾項 ($.arr[?(@.id)])、遞迴搜尋 ($..金鑰)
- 即時預覽: 即時執行查詢,帶語法醒目提示的 JSON 輸入和輸出,顯示比對路徑、結果計數,並在來源 JSON 中醒目提示比對節點
- 結果匯出: 將查詢結果匯出為 JSON(陣列或單一值)、表格資料的 CSV 或格式化文字,一鍵複製和下載選項
使用方法
- 輸入 JSON 資料: 貼上或上傳要查詢的 JSON 資料
- 編寫 JSONPath: 輸入 JSONPath 表示式或使用常見模式範本
- 執行查詢: 執行查詢以檢視帶語法醒目提示的比對結果
- 匯出結果: 以您喜歡的格式複製或下載提取的資料
生成原理
JSONPath 語法
JSONPath 表示式以 $(根物件)開頭,使用點符號 ($.property) 或括號符號 ($['property']) 進行存取。子節點使用 . 分隔符號 ($.store.book),陣列使用 [index] 或 [*] 表示所有項。陣列切片 [開始:end:步驟] 提取範圍,如 [0:3](前 3 項)或 [-1](最後一項)。遞迴下降運算子 .. 搜尋所有層級:$..author 尋找所有 author 屬性,無論巢狀深度如何。聯合運算子 [,] 選擇多個項:$[0,2,5] 獲取特定陣列索引。
過濾器表示式
過濾器使用 [?(@.condition)] 語法選擇符合條件的項。@ 表示迭代中的當前節點。比較運算子:==、!=、<、<=、>、>=。邏輯運算子:&& (and)、|| (or)、! (不)。範例:[?(@.price < 10)] 選擇價格低於 10 的項;[?(@.category == 'fiction' && @.price < 20)] 組合條件。正規表示式比對:[?(@.名稱 =~ /pattern/)] 按正規過濾。過濾器可以使用 $ 參考根以進行跨階層比較:[?(@.price < $.maxPrice)]。
實作變體
JSONPath 有多個實作,語法略有不同:Goessner 的原始版本(JavaScript)、Jayway(Java)、jsonpath-ng(Python)。差異包括過濾器運算子(有些使用 @ vs $)、正規支援、指令碼表示式和函式擴充。一些實作新增了函式,如 @.length、@.min()、@.max() 用於彙總。指令碼表示式 [(@.price * @.quantity)] 啟用計算。父運算子 ^ 和當前路徑 ~ 提供上下文。始終檢查目標實作的文件以瞭解支援的功能和語法特性。
常見問題
- 為什麼查詢沒有結果?
- 確認路徑以 $ 開頭、陣列索引正確、欄位名稱拼寫無誤。可先用簡短路徑逐步驗證。
- 如何在所有層級尋找某個鍵?
- 使用遞迴下降運算子:$..author 會在所有層級尋找 author。
- 過濾器語法怎麼寫?
- 使用 [?(@.price < 10)],@ 表示當前項目;可用 &&、|| 組合條件,如 [?(@.category=='book' && @.price<20)]。
- 空結果與 null 有何不同?
- 空結果代表沒有匹配;null 代表匹配項的值為 null。請檢查來源資料與路徑。
- 大型 JSON 查詢很慢怎麼辦?
- 避免過度使用 ..;先縮小搜尋範圍再過濾,必要時將資料分段或在後端預處理。
相關文件
- JSONPath 規範 - Goessner - 原始 JSONPath 提案和語法定義
- JSONPath 線上求值器 - 帶表示式文件的互動式 JSONPath 測試器
- RFC 9535 - JSONPath 標準 - IETF 對 JSONPath 查詢語言的標準化工作
- jsonpath-ng 文件 - 具有擴充功能的 Python JSONPath 實作
- Jayway JSONPath (Java) - 流行的帶過濾器表示式的 Java 實作