本文主要介绍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工程师,请私信联系!
如果认为此文对您有帮助,别忘了支持一下哦!
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。