接口测试-多层嵌套响应处理-JSONPath使用(Java版)

文章目录

  • [1. JSONPath 简介](#1. JSONPath 简介)
  • [2. JSONPath 语法使用](#2. JSONPath 语法使用)
  • [3. JSONPath 结合 代码使用](#3. JSONPath 结合 代码使用)
  • 总结

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本文开始

1. JSONPath 简介

  1. 在 JSON 数据中定位和提取特定信息的查询语言。
  2. JSONPath 使用类似于 XPath 的语法,使用路径表达式从 JSON 数据中选择和提取数据。
  3. 相比于传统的提取方式,更加灵活,并且支持定制化。

2. JSONPath 语法使用

  1. 语法知识。
  2. 第三方库调用。
符号 描述
$ 查询的根节点对象,用于表示一个 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));
}

总结

✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
Wect3 分钟前
深度剖析浏览器跨域问题
前端·面试·浏览器
小郑加油3 分钟前
python学习Day11:认识与创建CSV文件
开发语言·python·学习
Pkmer5 分钟前
Java程序员大战Python面向对象
python·ai编程
小龙报11 分钟前
【Coze-AI智能体平台】低代码省时高效:Coze 应用开发全流程指南
java·人工智能·python·深度学习·低代码·chatgpt·交互
技术钱12 分钟前
LCEL表达式与Runnable可运行协议
python
Echo_NGC223715 分钟前
【论文解读】Attention Is All You Need —— AI 时代的“开山之作“,经典中的经典(transformer小白导读)
人工智能·python·深度学习·神经网络·机器学习·conda·transformer
陈随易16 分钟前
bun将会支持Bun.image,你怎么看?
前端·后端·程序员
勿忘初心122128 分钟前
【Java实战】SpringBoot 集成 freemarker 导出 Word 模板
java·spring boot·freemarker·模板引擎·word导出·后端实战
jingqingdai333 分钟前
别用正则格式化 HTML!我用 DOM 遍历实现零风险本地格式化,老项目重构效率直接拉满
前端·重构·html