首页 > 解决方案 > 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

标签: javajsonapi

解决方案


推荐阅读