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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:42:33