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

OpenWeatherMap API解析报错:ArrayList无法转为Map问题求助

解决OpenWeatherMap API中weather数组的Gson解析问题

嘿,我完全懂你碰到的这个坑——OpenWeatherMap返回的weather字段是JSON数组(用[]包裹),可不是main、wind那种单个JSON对象,这就是你两种解析方式都报错的核心原因:

为啥原来的方法行不通?

  • 直接强转成Map<String, Object>:respMap.get("weather")实际是Gson解析后的List对象,根本不是单个Map,所以必然抛出ClassCastException。
  • 调用toString()再用jsonToMap解析:Java集合的toString()输出格式(比如[ {main=Clear, description=clear sky...} ])不是标准JSON字符串,Gson根本认不出来,自然会报IllegalStateException。

不大改现有代码的解决方案

我们只需要把weather字段先当成List处理,再取数组里的第一个元素(OpenWeatherMap的weather数组通常只有一个元素对应当前天气),就能转成你需要的Map了:

直接替换你代码中解析weather的部分,改成下面这段:

// 先把weather字段转为List<Map>,因为它是JSON数组
List<Map<String, Object>> weatherList = (List<Map<String, Object>>) respMap.get("weather");
// 取数组第一个元素(如果数组非空)
Map<String, Object> weatherMap = weatherList.get(0);

修改后的完整关键代码片段

try{
    StringBuilder result = new StringBuilder();
    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    BufferedReader rd = new BufferedReader(new InputStreamReader (conn.getInputStream()));
    String line;
    while ((line = rd.readLine()) != null){
        result.append(line);
    }
    rd.close();
    System.out.println(result);
    Map<String, Object > respMap = jsonToMap (result.toString());
    Map<String, Object > mainMap = jsonToMap (respMap.get("main").toString());
    Map<String, Object > windMap = jsonToMap (respMap.get("wind").toString());
    
    // 替换原来的weather解析逻辑
    List<Map<String, Object>> weatherList = (List<Map<String, Object>>) respMap.get("weather");
    Map<String, Object> weatherMap = weatherList.get(0);
    
    System.out.println("Location: " + LOCATION);
    System.out.println("Current Temperature: " + mainMap.get("temp") );
    System.out.println("Current Humidity: " + mainMap.get("humidity") );
    System.out.println("Max: " + mainMap.get("temp_min") );
    System.out.println("Min: " + mainMap.get("temp_max") );
    System.out.println("Desc: " + weatherMap.get("description") );
    System.out.println("Wind Speed: " + windMap.get("speed") );
    System.out.println("Wind Angle: " + windMap.get("deg") );
}catch (IOException e){
    System.out.println(e.getMessage());
}

这样既不用大幅修改你现有的jsonToMap工具方法,也能正确解析出天气描述了。要是想更健壮,还可以加个非空判断:if(weatherList != null && !weatherList.isEmpty()),避免数组为空时出现索引越界异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:41:20