RestAssured中Hamcrest多层数组断言报错问题咨询
问题分析与解决办法
看起来你遇到了RestAssured断言里的JSON路径匹配问题,我帮你拆解下问题所在和可行的解决办法:
首先,从报错信息里能揪出一个关键问题:JSON路径大小写不匹配!你的代码里用的是全小写的hotelavailabilities.rateplans.rooms.adults,但报错里显示实际返回的JSON键是驼峰命名的hotelAvailabilities.ratePlans——JSON键名是大小写敏感的,这是最容易踩的低级坑,第一步必须先把路径的大小写修正成和实际JSON结构完全一致。
其次,你的断言嵌套了多层anyOf和hasItemInArray,这完全是冗余操作:anyOf是用来匹配多个条件中的任意一个,但你这里只是要检查数组中是否存在某个特定值,根本不需要它。多层嵌套的hasItemInArray其实是对应JSON里的嵌套数组结构,但写法可以更简洁清晰。
假设你的JSON结构是典型的酒店可用率格式:
{ "hotelAvailabilities": [ { "ratePlans": [ { "rooms": [ { "adults": 2 } ] } ] } ] }
修正后的两种推荐写法:
写法1:对应嵌套数组结构的精确匹配
如果你想严格对应每一层的数组层级,去掉多余的anyOf即可:
builder.expectBody( "hotelAvailabilities.ratePlans.rooms.adults", hasItemInArray(hasItemInArray(hasItemInArray(Integer.parseInt(adults)))) );
这里每层hasItemInArray分别对应JSON里的hotelAvailabilities、ratePlans、rooms三层数组,最终匹配到adults字段的值。
写法2:用JSONPath通配符简化(更推荐)
用[*]通配符遍历所有层级的数组元素,直接检查所有adults值中是否包含目标整数,写法简洁且可读性更高:
builder.expectBody( "hotelAvailabilities[*].ratePlans[*].rooms[*].adults", hasItem(Integer.parseInt(adults)) );
这种方式不需要手动对应嵌套层数,只要路径正确,就能遍历所有符合条件的adults字段,直接检查目标值是否存在。
额外提醒:
- 确保
Integer.parseInt(adults)转换后的值和JSON里的adults类型一致(比如JSON里是数字类型,不是字符串) - 如果
adults本身就是整数变量,直接传入即可,不需要额外转换
内容的提问来源于stack exchange,提问作者Satya Kumar
相关产品推荐
相关产品推荐

