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进行比较:
XPath | JsonPath | 说明 |
---|---|---|
/ |
$ |
文档根元素 |
. |
@ |
当前元素 |
/ |
. 或[] |
匹配下级元素 |
.. |
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
}
}
}
接下来我们看一下如何对这个文档进行解析:
XPath | JsonPath | Result |
---|---|---|
/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')]");
参考文档:
JsonPath基本用法的更多相关文章
- Python Jsonpath模块用法
在使用Python做自动化校验的时候,经常会从Json数据中取值,所以会用到Jsonpath模块,这里做个简单的总结 1.关于jsonpath用来解析多层嵌套的json数据;JsonPath 是一种信 ...
- JsonPath的用法
有时候需要从json里面提取相关数据,必须得用到如何提取信息的知识,下面来写一下 语法格式 JsonPath 描述 $ 根节点 @ 当前节点 .or[] 子节点 .. 选择所有符合条件的节点 * 所有 ...
- alibaba/fastjson 之 JSONPath
JOSNPath 是一个非常强大的工具,对于处理 json 对象非常方便. 官方地址:https://github.com/alibaba/fastjson/wiki/JSONPath 基本用法:ht ...
- 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧
看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- 使用jsonpath解析json内容
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容.下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它. 一.首先需要 ...
- Python爬虫(十六)_JSON模块与JsonPath
本篇将介绍使用,更多内容请参考:Python学习指南 数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易 ...
- python中jsonpath模块的运用
1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...
- 【转】JsonPath教程
https://blog.csdn.net/koflance/article/details/63262484 1. 介绍 类似于XPath在xml文档中的定位,JsonPath表达式通常是用来路径检 ...
随机推荐
- oracle 触发器(自增写法)
触发器trigger 触发器我们也可以认为是存储过程,是一种特殊的存储过程. 存储过程:有输入参数和输出参数,定义之后需要调用 触发器:没有输入参数和输出参数,定义之后无需调用,在适当的时候会自动执行 ...
- 2019-2020-2 20199317《Linux内核原理与分析》第二周作业
第一章 计算机工作原理 1 存储程序计算机工作模型 存储程序计算机的主要思想是将程序存放在计算机存储器中,然后按存储器中的存储程序的首地址执行程序的第一条指令,以后就按照该程序中编写 ...
- JQuery之选择器的类型
JQuery中的选择器数量和JavaScript中的选择器数量相差无几,JQuery中的选择器类型如下图: 代码实现: <script src="JS/jquery-3.4.1.js& ...
- java内存模型和内存结构
java内存模型说的是多线程,网上可能会有写误导,并不是什么堆.栈.方法区,很多人都会搞混.说白了就是多线程中主线程和本地线程之间的一个数据可见性问题. jmm:java内存模型:jvm:java内存 ...
- luogu P1417 烹调方案 |dp
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- luogu P5171 Earthquake
题目描述 给定 a,b,c ,求满足方程 ax+by⩽c 的非负整数解个数. 输入格式 输入三个整数 a,,b,,c . 输出格式 输出一个整数表示答案. 类欧几里得算法 #include<cs ...
- Pandas学习(三)——NBA球员薪资分析
欢迎加入python学习交流群 667279387 学习笔记汇总 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学 ...
- 赌十包辣条,你一定没见过这么通透的ThreadLocal讲解
1.看个热闹 鉴于普罗大众都喜欢看热闹,咱们先来看个热闹再开工吧! 场景一: 中午了, 张三.李四和王五一起去食堂大菜吃饭.食堂刚经营不久,还很简陋,负责打菜的只有一位老阿姨. 张三:我要一份鸡腿. ...
- 嵌入式—ASCII码
为了可以在计算机保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母.符号,还加入了很多画表格时需要用下到的横线.竖线.交叉等形状,一直把序号编到了最后一个状态255.从128 到255 ...
- centos7下ldap+kerberos实现单点登陆
一. LDAP概念 http://wiki.jabbercn.org/index.php/OpenLDAP2.4%E7%AE%A1%E7%90%86%E5%91%98%E6%8C%87%E5%8D%9 ...