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

RestAssured Java如何正确将动态JSON响应字符串存入List

异常原因

运行抛出java.lang.String cannot be cast to java.util.ArrayList是因为路径写法和接收类型不匹配:

  • 你写的Map.List[i].country路径,定位到的是List数组中单个元素的country属性,这个属性本身是String类型(比如接口返回里的"us"、"aus"),直接用ArrayList<String>接收单个字符串,必然触发类型转换错误。
  • 你把集合变量声明在for循环内部,就算类型写对,每次循环都会重新创建集合,之前拿到的值会被直接覆盖,最终也存不下所有country值。
正确实现方案

RestAssured的JsonPath原生支持批量提取数组节点下的同名字段,不需要手动遍历索引,推荐直接用内置的getList方法一步获取结果:

public void getResponseString() {
    // 直接批量提取List数组下所有元素的country字段,返回类型就是List<String>
    List<String> countryList = getInfoResp.jsonPath().getList("Map.List.country");
    // 后续直接操作countryList即可
}

如果需要明确泛型类型、消除unchecked类型警告,可以用重载的getList方法指定元素类型:

public void getResponseString() {
    // 第二个参数明确集合内元素为String类型,类型校验更安全
    List<String> countryList = getInfoResp.jsonPath().getList("Map.List.country", String.class);
}

如果要保留你原来循环索引的写法,需要提前在循环外初始化集合,每次拿到单个String类型的country值后手动add到集合中:

public void getResponseString() {
    List<String> countryList = new ArrayList<>();
    int totalSize = getInfoResp.jsonPath().getInt("Map.List.size()");
    for (int i = 0; i < totalSize; i++) {
        // 单个索引下的country是String类型,不要用ArrayList接收
        String singleCountry = getInfoResp.jsonPath().get("Map.List[" + i + "].country");
        countryList.add(singleCountry);
    }
}
编写注意事项
  • 集合变量要声明在循环外部,避免每次循环重复创建集合导致数据丢失
  • 提取JSON数组下所有元素的同名属性时,直接写数组路径.属性名即可批量匹配所有值,不需要手动遍历索引,代码更简洁也不容易出现类型错误
  • 提取JSON数组类型的结果优先用getList()方法,不要直接用get()后强转集合,避免类型转换异常。

内容的提问来源于stack exchange,提问作者Halycon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:27:31