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

