使用JSONPath解析JSON資料

Deguang發表於2023-03-08

本文由 Deguang 發表於 碼路-技術部落格

在前端開發中,當介面返回一個複雜的巢狀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前,先了解下xPathxPathXML的路徑語言,使用路徑識別符號透過層級結構定位文件元素,例如在HTML 中定位元素:
HTML xPath

類似的,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判空

參考:
https://goessner.net/articles/JsonPath/

相關文章