我正在尝试运行一个返回当前天气的 Telegram 机器人(在用户从另一个函数检测到的 IP 的帮助下),但 JSON 解析无法正常工作。在返回之前,我从最后一行得到“线程“null Telegram Executor”java.lang.StackOverflowError”中的异常。 另一种方法产生了“空指针异常”,我按照这里的示例进行操作。
有什么方法可以用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":""
}
}
最佳答案
您的StackOverflowError
是尝试使用第二个库(org.json.JSONObject
)将根gson JsonObject
序列化为json的结果包装器):
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);
关于Java JSON对象解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46836438/