接口测试-多层嵌套响应处理-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
AA,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));
}

总结

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

相关推荐
奈斯先生Vector8 小时前
AIGC 视频生成换个拍法:用 Kling Video 把一张人物图变成可剪辑的短故事
开发语言·人工智能·windows·python·aigc·音视频
IT_陈寒8 小时前
Java的HashMap竟然不是线程安全的,现在才知道!
前端·人工智能·后端
IT_陈寒8 小时前
React hooks闭包陷阱让我加了一宿班
前端·人工智能·后端
不一样的少年_8 小时前
设计稿里的图片明明很清晰,为什么到了手机上却糊了?一文讲透 DPR、压缩与格式选择
前端·后端·图片资源
卷无止境8 小时前
当"精简主义"住进AI编程助手:Ponytail深度解读
后端·python·fastapi
计算机魔术师8 小时前
OpenAI内部数据曝光:AI已经替人类写了3.1倍的研究代码
前端
2601_962298278 小时前
交易开拓者通常使用什么编程语言?这种语言如何帮助自动化交易?
java·c++·python·编程语言·自动化交易
心易行者8 小时前
用html在线运行做数据可视化大屏,5个实战场景从入门到上线
大数据·前端·数据库·人工智能·python
光影少年8 小时前
从输入URL到页面渲染,React/RN 整体加载流程
前端·javascript·react native·react.js·前端框架
兔子零10248 小时前
我给 Pi Coding Agent 做了一个桌面控制台:Pi-Harness
前端·javascript·后端