You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:29