1. 概述
JsonPath 運算式可用於解析 JSON 結構的資料,官方 API 文檔:https://github.com/json-path/JsonPath,本文僅為對英文官方文檔的翻譯。
2. 基礎運算子
JsonPath 的根元素總是被稱為 $,無論它是一個物件還是陣列。
在 JsonPath 運算式中,可以使用點符號,例如:$.store.book[0].title;也可以使用方括號,例如:$['store']['book'][0]['title']。
運算子 | 描述 |
---|---|
$ | 根元素 |
. 或 [] | 獲取子元素 如:store.book 或 store["book"] |
.. | 後代選擇器,用來選取所有符合條件的元素 |
[,] | 合併運算子,用於選取若幹個元素 如:book[0,1] 或 $..book[0].["category","author"] |
[start:end] | 切片運算子,索引的起始值為 0 ,左閉右開 如:book[0:2] 或 book[-2:0] |
?() | 過濾器標識,用於篩選陣列,可以將過濾條件寫在括號中 |
@ | 表示當前正在被過濾器處理的元素,通常和過濾器配合使用 如:book[?(@.price<10)] |
* | 通配符。可以用於通配元素的名稱或索引 如:book.* 或 book[*] 也可以和過濾結合使用,作為正則運算式的元素 如:book[?(@.author =~ /.*ees/)] |
3. 過濾運算子
過濾器是用於篩選陣列的邏輯運算式,一個典型的過濾器是[?(@.age > 18)] ,其中,@ 表示當前正被過濾器處理的元素。透過加入邏輯運算子 && 和 || ,可以創造出更複雜的過濾器。字串的值必須使用單引號或雙引號括起來,如 ([?(@.color == 'blue')] 或[?(@.color == "blue")])。
運算子 | 描述 |
---|---|
== | 左右相等 注:會對比資料類型,如 1 和 '1' 不相等 |
!= | 左右不相等 |
< | 左側小於右側 |
<= | 左側小於或等於右側 |
> | 左側大於右側 |
>= | 左側大於或等於右側 |
=~ | 左側符合右側的正則運算式 如:[?(@.name =~ /foo.*?/i)] |
in | 左側存在於右側 如:[?(@.size in ['S', 'M'])] |
nin | |
subsetof | [?(@.sizes subsetof ['S', 'M', 'L'])] |
anyof | [?(@.sizes anyof ['M', 'L'])] |
noneof | [?(@.sizes noneof ['M', 'L'])] |
size | |
empty |
4. 函式
可以在路徑的末端呼叫函式。
函式 | 描述 | 匯出類型 |
---|---|---|
min() | ||
max() | ||
avg() | ||
stddev() | ||
length() | ||
sum() |
範例:
假設有這樣一個 JSON 結構:
JsonPath 運算式 | 結果 |
---|---|
$.store.book[*].author | 找到 store 元素下的所有書籍,匯出他們的作者 |
$..author | 根元素下所有的作者 |
$.store.* | store 元素下所有的東西,無論是書籍還是自行車 |
$.store..price | store 元素下的所有東西的價格 |
$..book[2] | 第 3 本書 |
$..book[-2] | 倒數第 2 本書 |
$..book[0,1] $..book[:2] | 前2本書 |
$..book[:2] | 前2本書(注意:第一本書的索引是0) |
$..book[1:2] | 第2本書 |
$..book[-2:] | 最後第2本和最後第1本書 |
$..book[2:] | 第3到最後1本書 |
$..book[?(@.isbn)] | 所有書籍中,含有 isbn 屬性的書籍 |
$.store.book[?(@.price < 10)] | 所有書籍中,價格低於10的書籍 |
$..book[?(@.price <= $['expensive'])] | 所有資料中,價格沒有超過 expensive 的書籍( expansive 的值為10) |
$..book[?(@.author =~ /.*REES/i)] | 找出符合正則運算式的書籍。 此正則運算式的含義:作者名以REES結尾,REES不區分大小寫 |
$..* | 匯出根元素下的所有內容 |
$.store.book.length() | 書籍的總數 |