天天看点

JsonPath基本用法

本文主要介绍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>(&lt;expr&gt;)</code> 使用表达式

<code>?(&lt;boolean expr&gt;)</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()&lt;3]</code>

<code>$..book[0,1]</code>,或 <code>$..book[:2]</code>

匹配前两个book节点

<code>//book[isbn]</code>

<code>$..book[?(@.isbn)]</code>

过滤含isbn字段的节点

<code>//book[price&lt;10]</code>

<code>$..book[?(@.price&lt;10)]</code>

过滤<code>price&lt;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工程师,请私信联系!

如果认为此文对您有帮助,别忘了支持一下哦!

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。转载时请在文章页面明显位置给出原文链接。