文章目录
- [1. JSONPath 简介](#1. JSONPath 简介)
- [2. JSONPath 语法使用](#2. JSONPath 语法使用)
- [3. JSONPath 结合 代码使用](#3. JSONPath 结合 代码使用)
- 总结
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。

本文开始
1. JSONPath 简介
- 在 JSON 数据中定位和提取特定信息的查询语言。
- JSONPath 使用类似于 XPath 的语法,使用路径表达式从 JSON 数据中选择和提取数据。
- 相比于传统的提取方式,更加灵活,并且支持定制化。
2. JSONPath 语法使用
- 语法知识。
- 第三方库调用。
| 符号 | 描述 |
|---|---|
| $ | 查询的根节点对象,用于表示一个 json 数据,可以是数组或对象 |
| @ | 过滤器(filter predicate)处理的当前节点对象 |
| * | 通配符 |
| . | 获取子节点 |
| . . | 递归搜索,筛选所有符合条件的节点; 类似获取子孙节点 |
| ?() | 过滤器表达式,筛选操作 |
| [start:end] | 数组片段,区间为[start,end),不包含 end |
| [A]或[A,B] | 迭代器下标,表示一个或多个数组下标 |
语法使用示例:
xml
$ : 获取Json对象
$..book : 获取根节点下所有book节点
$..book[*]
// 获取0到2下标的书,下标左闭右开[0,3)
$..book[0:3]
// 获取下标0和下标2的书
$..book[0,2]
//获取价格==8.95的书籍
$..book[?(@.price==8.95)]
获取所有书籍的作者
xml
$.store.book[*].author
$..book..author
获取所有作者
xml
$..author
获取 store 下面的所有内容
xml
$.store
$.store.*
获取所有的价格
xml
$..price
$.store..price
获取第三本书
xml
$..book[2]
获取所有包含 isbn 的书籍
包含之类-过滤
xml
$..book[?(@.isbn)]
获取所有价格小于 10 的书
xml
$..book[?(@.price<10)]
获取所有书籍的数量
jsonpath可以配合函数使用
xml
$..book.length
3. JSONPath 结合 代码使用
环境安装:
python环境配置: pip install jsonpath
xml
jsonpath.jsonpath(源数据对象, jsonpath表达式)
java环境配置:
xml
<properties>
<json-path.version>2.8.0</json-path.version>
</properties>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>${json-path.version}</version>
</dependency>
Java代码示例:
方式一获取:每次获取信息调用
JsonPath.read(responseBody, "$.data");
参数1:响应体;
参数2:JsonPath语法
java
/**
* Jsonpath获取响应体信息
* 每次调用JsonPath.read()方法获取
*/
@Test
void jsonPathTest() {
String jsonData = "{\"username\":\"zs\",\"password\":\"test123\",\"code\":\"\"}";
String responseBody = given()
.body(jsonData)
.when()
.post("https://httpbin.com/post")
.then()
.log().all()
//获取响应体信息
.extract().response().getBody()
//转为String格式
.asString();
//获取code
System.out.println("-------------响应体信息-----------");
System.out.println(responseBody);
System.out.println("----------提取data--------------");
String data = JsonPath.read(responseBody, "$.data");
System.out.println(data);
System.out.println("----------提取code--------------");
ArrayList<String> code = JsonPath.read(responseBody, "$..code");
System.out.println(code);
}
Java代码示例2:
方式2获取: 使用JsonPath.parse(responseBody)一次调用JsonPath方法,后续直接使用read()方法获取想要的数据;
java
//1.获取响应体
DocumentContext context = JsonPath.parse(responseBody);
//2.直接使用,参数是:jsonpath语法获取
String url = context.read("$.url");
java
/**
* jsonpath获取响应体信息
* 调用JsonPath.parse()方法-只调用一次JsonPath方法
*/
@Test
void jsonPathTest2() {
String jsonData = "{\"username\":\"zs\",\"password\":\"test123\",\"code\":\"\"}";
String responseBody = given()
.body(jsonData)
.when()
.post("https://httpbin.com/post")
.then()
.log().all()
//获取响应体信息
.extract().response().getBody()
//转为String格式
.asString();
DocumentContext context = JsonPath.parse(responseBody);
System.out.println("----------提取data--------------");
String url = context.read("$.url");
System.out.println(url);
System.out.println("----------提取code--------------");
ArrayList<String> codeList = context.read("$..code");
System.out.println(codeList);
assertEquals("",codeList.get(0));
}
总结
✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!
