【轉】JsonPath基本用法

文章來源:https://www.cnblogs.com/youring2/p/10942728.html

官網地址:https://goessner.net/articles/JsonPath/

JsonPath基本用法

本文主要介紹JsonPath的基本語法,並演示如何在Newtonsoft.Json中進行使用。

JsonPath的來源

看它的名字你就能知道,這傢伙和JSON文檔有關係,正如XPath之於XML文檔一樣,JsonPath爲Json文檔提供瞭解析能力,通過使用JsonPath,你可以方便的查找節點、獲取想要的數據,JsonPath是Json版的XPath。

JsonPath語法

JsonPath的語法相對簡單,它採用開發語言友好的表達式形式,如果你瞭解類C語言,對JsonPath就不會感到不適應。

JsonPath語法要點:

  • $ 表示文檔的根元素
  • @ 表示文檔的當前元素
  • .node_name 或 ['node_name'] 匹配下級節點
  • [index] 檢索數組中的元素
  • [start:end:step] 支持數組切片語法
  • * 作爲通配符,匹配所有成員
  • .. 子遞歸通配符,匹配成員的所有子元素
  • (<expr>) 使用表達式
  • ?(<boolean expr>)進行數據篩選

下表將列舉所有支持的語法,並對XPath進行比較:

XPathJsonPath說明
/ $ 文檔根元素
. @ 當前元素
/ .[] 匹配下級元素
.. N/A 匹配上級元素,JsonPath不支持此操作符
// .. 遞歸匹配所有子元素
* * 通配符,匹配下級元素
@ N/A 匹配屬性,JsonPath不支持此操作符
[] [] 下標運算符,根據索引獲取元素,XPath索引從1開始,JsonPath索引從0開始
` ` [,]
N/A [start:end:step] 數據切片操作,XPath不支持
[] ?() 過濾表達式
N/A () 腳本表達式,使用底層腳本引擎,XPath不支持
() N/A 分組,JsonPath不支持

注意:

  • JsonPath的索引從0開始計數
  • JsonPath中字符串使用單引號表示,例如:$.store.book[?(@.category=='reference')]中的'reference'

JsonPath示例

下面是相應的JsonPath的示例,代碼來源於https://goessner.net/articles/JsonPath/,JSON文檔如下:

{
	"store": {
		"book": [{
				"category": "reference",
				"author": "Nigel Rees",
				"title": "Sayings of the Century",
				"price": 8.95
			}, {
				"category": "fiction",
				"author": "Evelyn Waugh",
				"title": "Sword of Honour",
				"price": 12.99
			}, {
				"category": "fiction",
				"author": "Herman Melville",
				"title": "Moby Dick",
				"isbn": "0-553-21311-3",
				"price": 8.99
			}, {
				"category": "fiction",
				"author": "J. R. R. Tolkien",
				"title": "The Lord of the Rings",
				"isbn": "0-395-19395-8",
				"price": 22.99
			}
		],
		"bicycle": {
			"color": "red",
			"price": 19.95
		}
	}
}

接下來我們看一下如何對這個文檔進行解析:

XPathJsonPathResult
/store/book/author $.store.book[*].author 所有book的author節點
//author $..author 所有author節點
/store/* $.store.* store下的所有節點,book數組和bicycle節點
/store//price $.store..price store下的所有price節點
//book[3] $..book[2] 匹配第3個book節點
//book[last()] $..book[(@.length-1)],或 $..book[-1:] 匹配倒數第1個book節點
//book[position()<3] $..book[0,1],或 $..book[:2] 匹配前兩個book節點
//book[isbn] $..book[?(@.isbn)] 過濾含isbn字段的節點
//book[price<10] $..book[?(@.price<10)] 過濾price<10的節點
//* $..* 遞歸匹配所有子節點
你可以在http://jsonpath.com/站點進行驗證JsonPath的執行效果。    

在Newtonsoft.Json中的用法

JsonPath是語言無關的表達式語言,Newtonsoft.Json庫提供了對JsonPath的支持,它提供了JObject.SelectToken()JObject.SelectTokens()方法來使用JsonPath解析Json文檔,代碼如下:

//創建JObject對象
var jObj = JObject.Parse(jsonString);
var books = jObj.SelectToken("$.store.book[?(@.category=='reference')]");

參考文檔:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章