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
相关产品推荐
相关产品推荐

