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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:47:50