Rest-assured测试中GET请求JSON反序列化为Java对象失败问题排查
解决Rest-Assured中JSON反序列化的问题
你的问题主要出在两个关键地方,我们一步步拆解解决:
1. 最外层JSON是数组,而非单个对象
你提供的JSON最外层是[],说明接口返回的是Root对象的集合,但你的测试代码里用了.extract().as(Root.class)——这会让Jackson尝试把数组转换成单个Root对象,直接触发解析异常,甚至会引发后续字段解析的连锁错误(比如你看到的User相关的START_ARRAY报错)。
解决方法有两种,选你习惯的方式即可:
- 用数组接收结果:
Root[] rootArray = given() .contentType(ContentType.JSON) .log().all() .auth().preemptive().basic("login", "password") .get(BaseUrl + STORE_INSTANCE) .then() .statusCode(200) .extract().as(Root[].class); - 用List接收结果(更灵活,方便后续操作):
List<Root> rootList = given() .contentType(ContentType.JSON) .log().all() .auth().preemptive().basic("login", "password") .get(BaseUrl + STORE_INSTANCE) .then() .statusCode(200) .extract().jsonPath().getList("", Root.class);
2. 额外验证POJO与JSON的匹配细节
虽然你生成的POJO看起来和JSON结构对齐,但还是要确认几个容易踩坑的点:
- 确保所有字段名称完全一致(大小写敏感,比如JSON里的
factorUser和POJO里的factorUser必须完全对应) - 检查
port字段:JSON里是数字类型,POJO里用long是没问题的,但如果接口实际返回字符串类型的数字,就需要把POJO字段改成String或者加注解适配 - 确认
User类的admin字段是boolean类型,和JSON里的true/false匹配正确
关于Cannot deserialize instance of User out of START_ARRAY token的原因
这个错误的核心是:Jackson在某个预期是单个User对象的位置,遇到了数组([])。结合你的场景,大概率是因为最外层数组被当成单个Root对象解析时,内部字段的解析逻辑被打乱,导致误把某个数组字段当成了User对象。修复最外层的解析方式后,这个错误应该会自动消失。
如果修复后还是出现这个报错,那就要检查接口实际返回的JSON里,是否factorUser字段被意外返回成了数组(比如"factorUser": [{"username": "..."}])——这种情况下,你需要把POJO里的factorUser改成User[]或者List<User>,或者联系后端修正返回的JSON结构。
内容的提问来源于stack exchange,提问作者Otto Rahn
相关产品推荐
相关产品推荐

