2017-10-19 220 views
0

我想運行一個返回當前天氣的電報機器人(在用戶檢測到來自另一個函數的ip的幫助下),但JSON解析無法正常工作。在返回之前,從最後一行得到「線程中的異常」null電報執行程序「java.lang.StackOverflowError」。 另一種方法產生了「空指針異常」,我從這裏開始了一個例子。Java JSON對象解析

任何方式來解析與java和GSON JSON?

public String palautaSaatila() throws MalformedURLException, IOException { 

    String sURL = "http://api.wunderground.com/api/" + wundergroundApikey + "/conditions/q/" + valtio + "/" + kaupunki + ".json"; 
    System.out.println(sURL); 
    // Connect to the URL using java's native library 
    URL url = new URL(sURL); 
    HttpURLConnection request = (HttpURLConnection) url.openConnection(); 
    request.connect(); 
    System.out.println("Connect ok"); 

    // Convert to a JSON object to print data 
    JsonParser jp = new JsonParser(); //from gson 
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent())); //Convert the input stream to a json element 
    JsonObject rootobj = root.getAsJsonObject(); //May be an array, may be an object. 
    String tempSaatila = new JSONObject(rootobj).toString(2); 

    return tempSaatila; 
} 

JSON響應看起來是這樣的,我只需要「天時」鍵:

{ 
    "response": { 
    "version":"0.1", 
    "termsofService":"http://www.wunderground.com/weather/api/d/terms.html", 
    "features": { 
     "conditions": 1 
    } 
    }, 
    "current_observation": { 
    "image": { 
     "url":"http://icons.wxug.com/graphics/wu2/logo_130x80.png", 
     "title":"Weather Underground", 
     "link":"http://www.wunderground.com" 
    }, 
    "display_location": { 
     "full":"Oulu, Finland", 
     "city":"Oulu", 
     "state":"", 
     "state_name":"Finland", 
     "country":"FI", 
     "country_iso3166":"FI", 
     "zip":"00000", 
     "magic":"138", 
     "wmo":"02876", 
     "latitude":"65.01999664", 
     "longitude":"25.46999931", 
     "elevation":"14.9" 
    }, 
    "observation_location": { 
     "full":"Oulu, Oulu, ", 
     "city":"Oulu, Oulu", 
     "state":"", 
     "country":"FI", 
     "country_iso3166":"FI", 
     "latitude":"64.984344", 
     "longitude":"25.499750", 
     "elevation":"30 ft" 
    }, 
    "estimated": { 
    }, 
    "station_id":"IOULU38", 
    "observation_time":"Last Updated on October 19, 9:17 PM EEST", 
    "observation_time_rfc822":"Thu, 19 Oct 2017 21:17:35 +0300", 
    "observation_epoch":"1508437055", 
    "local_time_rfc822":"Thu, 19 Oct 2017 21:18:13 +0300", 
    "local_epoch":"1508437093", 
    "local_tz_short":"EEST", 
    "local_tz_long":"Europe/Helsinki", 
    "local_tz_offset":"+0300", 
    "weather":"Mostly Cloudy", 
    "temperature_string":"34.2 F (1.2 C)", 
    "temp_f":34.2, 
    "temp_c":1.2, 
    "relative_humidity":"99%", 
    "wind_string":"Calm", 
    "wind_dir":"SW", 
    "wind_degrees":233, 
    "wind_mph":0.0, 
    "wind_gust_mph":0, 
    "wind_kph":0, 
    "wind_gust_kph":0, 
    "pressure_mb":"1018", 
    "pressure_in":"30.06", 
    "pressure_trend":"0", 
    "dewpoint_string":"34 F (1 C)", 
    "dewpoint_f":34, 
    "dewpoint_c":1, 
    "heat_index_string":"NA", 
    "heat_index_f":"NA", 
    "heat_index_c":"NA", 
    "windchill_string":"34 F (1 C)", 
    "windchill_f":"34", 
    "windchill_c":"1", 
    "feelslike_string":"34 F (1 C)", 
    "feelslike_f":"34", 
    "feelslike_c":"1", 
    "visibility_mi":"6.2", 
    "visibility_km":"10.0", 
    "solarradiation":"0", 
    "UV":"0.0","precip_1hr_string":"0.00 in (0 mm)", 
    "precip_1hr_in":"0.00", 
    "precip_1hr_metric":" 0", 
    "precip_today_string":"0.00 in (0 mm)", 
    "precip_today_in":"0.00", 
    "precip_today_metric":"0", 
    "icon":"mostlycloudy", 
    "icon_url":"http://icons.wxug.com/i/c/k/nt_mostlycloudy.gif", 
    "forecast_url":"http://www.wunderground.com/global/stations/02876.html", 
    "history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IOULU38", 
    "ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=64.984344,25.499750", 
    "nowcast":"" 
    } 
} 
+0

你可以使用GSON例如JSON字符串將json輸出保存到一個文件中,然後試着解析該文件中的數據。 「null Telegram Executor」異常看起來與JSON解析無關。 – hkasera

回答

3

StackOverflowError是試圖連載根GSON JsonObject爲JSON與第二個庫結果(在org.json.JSONObject包裝):

String tempSaatila = new JSONObject(rootobj).toString(2); 

你已經解析的文件,GSON並且可以使用其API來找到你想要的節點:

return rootobj 
    .getAsJsonObject("current_observation") 
    .get("weather") 
    .getAsString(); 

如果你想漂亮地打印與GSON一個節點,你可以做這樣的:

Gson gson = new GsonBuilder().setPrettyPrinting().create(); 
String json = gson.toJson(rootobj); 
System.out.println(json); 
+0

這工作完美無瑕!我不知道爲什麼解析JSON的概念很難理解 - 除了學習sw eng之外,我自己一直在研究這個,我還沒有找到任何好的教程,也沒有關於GSON的簡明文檔。謝謝! – taeraeyttaejae

1

您可以分析如下

Gson gson = new Gson(); 
    JsonObject jsonObject = gson.fromJson(json, JsonObject.class); 
    JsonObject currentObservation = jsonObject.get("current_observation").getAsJsonObject(); 

    String weather = currentObservation.get("weather").getAsString(); 
    System.out.println("weather = " + weather);