java - OpenWeatherMap 将 arraylist 转换为 Map
问题描述
我正在为我的项目使用 openweatherMap api。这个想法是获取任何地方的当前天气。我使用 gson 转换 json 文件,一切似乎都正常。我试图从json 文件,但它存储在 arraylist 中,所以我得到了 arraylist 无法转换为 map 的错误,如果没有对程序进行重大更改,我无法解决这个问题
这是我要解析的 json 文件: https ://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22
一切都适用于来自 json 文件的主要和风信息,但不适用于天气,因为它是数组列表。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.*;
import com.google.gson.reflect.*;
public class DailyForecst {
public static Map<String,Object> jsonToMap(String str){
Map<String,Object> map = new Gson().fromJson(str,new
TypeToken<HashMap<String,Object>> () {}.getType());
return map;
}
public static void main(String[] args) {
String API_KEY = "16 digit Private Key";
String LOCATION = "fresno,us";
String urlString = "http://api.openweathermap.org/data/2.5/weather?q=" + LOCATION + "&appid=" + API_KEY + "&units=imperial";
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());
Map<String, Object> weatherMap = (Map<String, Object>) respMap.get("weather");
// Map<String, Object > weatherMap = jsonToMap (respMap.get("weather").toString());
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());
}
}
}
我尝试使用与 main 和 wind 相同的方式: Map weatherMap = jsonToMap (respMap.get("weather").toString()); .但我得到了错误:
////java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 3 列路径 $[0] 处为 BEGIN_OBJECT
所以我尝试不将 json 转换为 Map,而是直接使用 Map weatherMap = (Map) respMap.get("weather"); 但我得到了
////java.lang.ClassCastException: java.util.ArrayList 无法转换为 java.util.Map
解决方案
推荐阅读
- wpf - 动态创建控件上的 PowerShell WPF 事件处理程序
- java - British Airways 网站是否实施站点预防自动化
- python - QPlainTextEdit 使用大约 6 倍的文本内存
- python - 如何删除音频文件开头的哔声?
- javascript - 快速中间人中的异步地狱
- npm - 如何删除已发布的 npm 包的所有先前版本,并使用最后发布的版本作为 1.0.0 版本?
- java - 将表别名与 h2 和 JdbcTemplate 一起使用
- c++ - 与 i7 处理器相比,使用 Windows API CreateWaitableTimer 休眠在 Xeon 上的执行方式不同
- php - 如何限制与存储的数据库条目相关的@foreach 循环?
- java - 将 InputStream 转换为 StringBuilder 并将 StringBuilder 转换为 OutputStream