2017-10-19 227 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);