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

总结

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

相关推荐
耶夫斯计3 分钟前
【SQL_agent】基于LLM实现sql助理
数据库·python·sql·语言模型
脩衜者3 分钟前
极其灵活且敏捷的WPF组态控件ConPipe 2026
前端·物联网·ui·wpf
vibag4 分钟前
RAG向量数据库
python·语言模型·langchain·大模型
kisshuan123964 分钟前
基于YOLO11改进的C3k2-AdditiveBlock实现命中检测与双重命中事件识别_1
python
mg6685 分钟前
0基础开发学习python工具_____用 Python + Pygame 打造绚丽烟花秀 轻松上手体验
开发语言·python·学习·pygame
掉鱼的猫7 分钟前
灵动如画 —— 初识 Solon Graph Fluent API 编排
java·openai·workflow
Mike_jia8 分钟前
Dockge:轻量开源的 Docker 编排革命,让容器管理回归优雅
前端
周杰伦fans9 分钟前
AndroidStudioJava国内镜像地址gradle
android·java·android-studio
艾莉丝努力练剑9 分钟前
【Linux进程控制(一)】进程创建是呼吸,进程终止是死亡,进程等待是重生:进程控制三部曲
android·java·linux·运维·服务器·人工智能·安全
GISer_Jing14 分钟前
前端GEO优化:AI时代的SEO新战场
前端·人工智能