Rest Assured如何从RequestSpecification/FilterableRequestSpecification请求体按JsonPath删除属性
通用JsonPath属性删除实现方案
方案核心逻辑
使用Jayway JsonPath库的原生修改能力,它支持直接按JsonPath表达式批量删除匹配节点,无需针对JSON结构硬编码遍历逻辑,适配任意嵌套层级、数组场景。
前置依赖
如果项目未引入该库,补充对应依赖即可:
Maven依赖:
<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>2.8.0</version> </dependency>
Gradle依赖:
implementation 'com.jayway.jsonpath:json-path:2.8.0'
完整实现代码
import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; import io.restassured.specification.FilterableRequestSpecification; public class JsonPathUtils { /** * 按JsonPath表达式删除请求体中对应属性 * @param frs 可过滤的Rest Assured请求规范对象 * @param jsonPath 要删除的属性路径,示例:$.items[*].itemsProperties[*].code */ public static void removePropertyByJsonPath(FilterableRequestSpecification frs, String jsonPath) { // 取出原始请求体 String originalBody = frs.getBody().toString(); // 解析为可修改的JsonPath上下文 DocumentContext documentContext = JsonPath.parse(originalBody); // 按路径删除所有匹配节点,路径不存在时自动容错不报错 documentContext.delete(jsonPath); // 生成修改后的JSON字符串 String modifiedBody = documentContext.jsonString(); // 把新的请求体写回RequestSpecification frs.body(modifiedBody); } }
使用示例
针对你给出的JSON结构,要删除所有items数组元素下itemsProperties里的code字段,直接调用即可:
FilterableRequestSpecification frs= (FilterableRequestSpecification) rs; // 路径说明:$代表根节点,[*]代表匹配数组所有元素 JsonPathUtils.removePropertyByJsonPath(frs, "$.items[*].itemsProperties[*].code");
如果要删除指定条件的属性,比如只删除code等于value1的字段,直接调整路径表达式即可:
JsonPathUtils.removePropertyByJsonPath(frs, "$.items[*].itemsProperties[?(@.code == 'value1')].code");
方案优势
- 完全通用,无需适配不同JSON结构,支持任意嵌套层级、数组场景
- 兼容复杂过滤逻辑,可通过JsonPath表达式实现条件删除
- 内置容错机制,路径不存在时不会抛出异常,适合通用工具类封装
内容的提问来源于stack exchange,提问作者Bartosz Olczak
相关产品推荐
相关产品推荐

