本文主要介紹JsonPath的基本文法,并示範如何在Newtonsoft.Json中進行使用。
看它的名字你就能知道,這家夥和JSON文檔有關系,正如XPath之于XML文檔一樣,JsonPath為Json文檔提供了解析能力,通過使用JsonPath,你可以友善的查找節點、擷取想要的資料,JsonPath是Json版的XPath。
JsonPath的文法相對簡單,它采用開發語言友好的表達式形式,如果你了解類C語言,對JsonPath就不會感到不适應。
JsonPath文法要點:
<code>$</code> 表示文檔的根元素
<code>@</code> 表示文檔的目前元素
<code>.node_name</code> 或 <code>['node_name']</code> 比對下級節點
<code>[index]</code> 檢索數組中的元素
<code>[start:end:step]</code> 支援數組切片文法
<code>*</code> 作為通配符,比對所有成員
<code>..</code> 子遞歸通配符,比對成員的所有子元素
<code>(<expr>)</code> 使用表達式
<code>?(<boolean expr>)</code>進行資料篩選
下表将列舉所有支援的文法,并對XPath進行比較:
XPath
JsonPath
說明
<code>/</code>
<code>$</code>
文檔根元素
<code>.</code>
<code>@</code>
目前元素
<code>.</code>或<code>[]</code>
比對下級元素
<code>..</code>
<code>N/A</code>
比對上級元素,JsonPath不支援此操作符
<code>//</code>
遞歸比對所有子元素
<code>*</code>
通配符,比對下級元素
比對屬性,JsonPath不支援此操作符
<code>[]</code>
下标運算符,根據索引擷取元素,XPath索引從1開始,JsonPath索引從0開始
`
<code>[,]</code>
<code>[start:end:step]</code>
資料切片操作,XPath不支援
<code>?()</code>
過濾表達式
<code>()</code>
腳本表達式,使用底層腳本引擎,XPath不支援
分組,JsonPath不支援
注意:
JsonPath的索引從0開始計數
JsonPath中字元串使用單引号表示,例如:<code>$.store.book[?(@.category=='reference')]</code>中的<code>'reference'</code>
下面是相應的JsonPath的示例,代碼來源于https://goessner.net/articles/JsonPath/,JSON文檔如下:
接下來我們看一下如何對這個文檔進行解析:
Result
<code>/store/book/author</code>
<code>$.store.book[*].author</code>
所有book的author節點
<code>//author</code>
<code>$..author</code>
所有author節點
<code>/store/*</code>
<code>$.store.*</code>
store下的所有節點,book數組和bicycle節點
<code>/store//price</code>
<code>$.store..price</code>
store下的所有price節點
<code>//book[3]</code>
<code>$..book[2]</code>
比對第3個book節點
<code>//book[last()]</code>
<code>$..book[(@.length-1)]</code>,或 <code>$..book[-1:]</code>
比對倒數第1個book節點
<code>//book[position()<3]</code>
<code>$..book[0,1]</code>,或 <code>$..book[:2]</code>
比對前兩個book節點
<code>//book[isbn]</code>
<code>$..book[?(@.isbn)]</code>
過濾含isbn字段的節點
<code>//book[price<10]</code>
<code>$..book[?(@.price<10)]</code>
過濾<code>price<10</code>的節點
<code>//*</code>
<code>$..*</code>
遞歸比對所有子節點
你可以在http://jsonpath.com/站點進行驗證JsonPath的執行效果。
JsonPath是語言無關的表達式語言,Newtonsoft.Json庫提供了對JsonPath的支援,它提供了<code>JObject.SelectToken()</code>和<code>JObject.SelectTokens()</code>方法來使用JsonPath解析Json文檔,代碼如下:
參考文檔:
https://goessner.net/articles/JsonPath/
https://www.newtonsoft.com/json/help/html/SelectToken.htm
2021年9月 北京、西安兩地,高薪誠聘 .NET工程師,請私信聯系!
如果認為此文對您有幫助,别忘了支援一下哦!
聲明:本部落格原創文字隻代表本人工作中在某一時間内總結的觀點或結論,與本人所在機關沒有直接利益關系。轉載時請在文章頁面明顯位置給出原文連結。