RestAssured匹配匿名根列表元素断言失败,如何修正JSON Path?
问题描述
接口返回的JSON数据:
[ {"name": "a"}, {"name": "b"} ]
使用RestAssured编写的断言代码:
given() .get("endpoint") .then() .body("$.name", hasItem("b"));
运行后触发断言错误:
java.lang.AssertionError: 1 expectation failed. JSON path $.name doesn't match. Expected: (a collection containing "b") Actual: <[]>
尝试多种路径写法仍无法解决,问题出在哪里?
问题原因及解决办法
问题出在JSON Path路径写法错误:
- 当接口返回的是JSON数组时,
$.name无法正确提取数组内每个对象的name属性。因为$代表根节点(这里是数组),直接写$.name会尝试从根数组本身获取name字段,而数组没有这个属性,所以返回空集合<[]>,导致断言失败。
正确的路径写法有三种,任选其一即可:
- 直接使用
name(RestAssured会自动遍历数组,提取所有元素的name字段)
given() .get("endpoint") .then() .body("name", hasItem("b"));
- 使用
$..name(递归提取所有层级的name值,适合嵌套结构,这里也能生效)
given() .get("endpoint") .then() .body("$..name", hasItem("b"));
- 使用
[*].name(明确指定遍历数组中所有元素,提取每个元素的name字段)
given() .get("endpoint") .then() .body("[*].name", hasItem("b"));
上述写法都能正确提取出包含"a"和"b"的集合,让hasItem("b")断言成功通过。
内容的提问来源于stack exchange,提问作者mdong
相关产品推荐
相关产品推荐

