Android Retrofit:将API响应存入ArrayList遇构造函数解析错误求助
问题排查与解决方案
嘿,我来帮你搞定这个报错问题~先直接说根本原因,你代码里的两处错误导致了这个“无法推断构造器参数”的问题:
1. 数据结构匹配错误
看你贴的API响应示例,返回的根JSON对象不是单个Weather对象,而是一个包含weather数组的复合对象(里面还有coord、main这些字段)。你之前把response.body()强制转成Weather类型,本身就是错误的类型转换,完全不符合API的返回结构。
2. ArrayList构造器使用错误
ArrayList没有接受单个对象的构造方法,你写的new ArrayList<>(((Weather)response.body()))相当于给构造器传了一个非Collection类型的参数,编译器自然找不到对应的构造方法,所以报错“无法解析构造器”。
解决步骤
第一步:创建匹配API结构的POJO类
你需要先定义对应JSON结构的Java类,至少包含根响应类和Weather类(其他字段如coord、main可以按需补充):
// 根响应类,对应整个JSON返回体 public class WeatherResponse { private Coord coord; private List<Weather> weather; private String base; private Main main; // 生成getter方法(setter可选,GSON序列化不需要) public List<Weather> getWeather() { return weather; } // 嵌套的Coord类,按需实现getter public static class Coord { private double lon; private double lat; } // 嵌套的Main类,按需实现getter public static class Main { private double temp; private double feels_like; // 其他字段... } } // Weather类,对应weather数组里的单个元素 public class Weather { private int id; private String main; private String description; private String icon; // 生成getter方法 }
第二步:修改Retrofit接口方法
确保你的Retrofit接口返回的是Call<WeatherResponse>,而不是其他类型:
public interface WeatherApiService { @GET("你的API接口路径") Call<WeatherResponse> getWeather( @Query("locationCode") String locationCode, @Query("apiKey") String apiKey ); }
第三步:修正后台线程的处理代码
现在可以正确获取并转换响应数据,取出weather列表:
// 后台线程执行网络请求 try { Response<WeatherResponse> response = getWeather(locationCode, apiKey).execute(); if (cancelRequest) { return; } // 用isSuccessful()判断比直接判断code==200更稳妥,它包含200-299的状态码 if (response.isSuccessful()) { WeatherResponse weatherResponse = response.body(); if (weatherResponse != null && weatherResponse.getWeather() != null) { // 直接从根响应中取出weather列表,转成ArrayList(如果需要独立列表的话) List<Weather> weatherList = new ArrayList<>(weatherResponse.getWeather()); Log.d(TAG, "获取到天气列表,长度:" + weatherList.size()); // 这里可以把列表传给LiveData // mWeather.postValue(weatherList); } } } catch (IOException e) { Log.e(TAG, "网络请求失败", e); }
额外说明
- 如果不需要独立的ArrayList对象,直接用
weatherResponse.getWeather()返回的列表也可以,因为GSON已经帮你把JSON数组转成了List<Weather>。 - 建议用
response.isSuccessful()替代response.code() == 200,它能覆盖所有成功的HTTP状态码,代码更健壮。
内容的提问来源于stack exchange,提问作者AndroidDev123
相关产品推荐
相关产品推荐

