在前端開發中,當介面返回一個複雜的巢狀JSON時,獲取其中某個固定層級的資料,需要使用鏈式取值
// 介面資料
var obj = {
name: "歷史書",
value: 3,
children: [
{
name: "明清",
value: "3-1",
count: 10
},
{
name: "近代",
value: "3-2",
count: 20
}
]
}
// 獲取第二個子型別的value
const val = obj.children[1].value // 3-2
當層級結構再次變長,使用鏈式取值程式碼冗長,且容易出錯如,若這裡的資料層級出現問題,比如children
長度僅為1,就會遇到我們常見的報錯:Uncaught TypeError: Cannot read property 'value' of undefined
。
為了避免報錯導致問題,這裡就可以使用 JSONPath
來進行取值。
JSONPath
在認識JSONPath
前,先了解下xPath
。xPath
是XML
的路徑語言,使用路徑識別符號透過層級結構定位文件元素,例如在HTML 中定位元素:
類似的,JSONPath
是透過路徑檢索JSON,支援運算子、函式、過濾器等用法,方便快速定位,上面的value獲取,可以用JSONPath 描述為JSONPath('$.children[1].value', obj)
運算子
符號 | 描述 |
---|---|
$ | 查詢的根節點物件,用於表示一個ison資料,可以是陣列或物件 |
@ | 過濾器斷言 (filter predicate) 處理的當前節點物件,類似於iava中的this欄位 |
* | 萬用字元,表示一個名字或數字 |
* | 遞迴搜尋 |
.<name> | 子節點 |
['<name>'(,'<name>') | 一個或多個子節點 |
<number> (, <number>)] | 一個或多個陣列下標 |
[start:end] | 陣列片段,區間為[start.end),不包含end |
[?(<expression>)] | 過濾器表示式,表示式結果必須是boolean |
函式
函式可以在路徑的尾部呼叫,函式的輸出是路徑表示式的輸出
符號 | 描述 | 輸出 |
---|---|---|
min() | 獲取數值型別陣列的最小值 | Double |
max() | 獲取數值型別陣列的最大值 | Double |
avg() | 獲取數值型別陣列的平均值 | Double |
stddev() | 獲取數值型別陣列的標準差 | Double |
length() | 獲取數值型別陣列的長度 | Integer |
過濾器
過濾器是用於篩選陣列的邏輯表示式。
運算子 | 描述 |
---|---|
== | 等於,但數字1不等於字元1 |
!= | 不等於 |
< | 小於 |
<= | 小於等於 |
> | 大於 |
>= | 大於等於 |
=~ | 判斷是否符合正規表示式,例如[?(@.value =~ foo.*?/i)] |
in | 所屬符號,例如[?(@.size in [s,M)] |
nin | 排除 |
size | 長度 |
empty | 判空 |