2017-10-19 17 views
0

J'essaie d'exécuter un bot de télégramme qui renvoie la météo actuelle (avec l'aide de l'ip détectée par l'utilisateur d'une autre fonction), mais l'analyse JSON ne fonctionne pas correctement. Je reçois "Exception dans le fil" null Télégramme Executor "java.lang.StackOverflowError" de la dernière ligne avant le retour. Une autre approche à ceci a donné "l'exception de pointeur nul", où j'ai suivi un exemple d'ici. Un moyen d'analyser un JSON avec Java et GSON?Java JSON analyse d'objet

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; 
} 

La réponse JSON ressemble à ceci, je ne ai besoin du « temps » clé:

{ 
    "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

Vous pourriez Enregistrez la sortie json dans un fichier et essayez simplement d'analyser les données de ce fichier. L'exception "null Telegram Executor" semble non pertinente pour l'analyse JSON. – hkasera

Répondre

3

Votre StackOverflowError est le résultat d'essayer de serialise la gson racine JsonObject JSON avec une seconde bibliothèque (l'emballage org.json.JSONObject):

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

vous avez déjà analysé le fichier avec gson et peut utiliser son API pour trouver le nœud que vous voulez:

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

Si vous voulez jolie imprimer un nœud avec gson vous pouvez le faire comme ceci:

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

Cela a fonctionné parfaitement! Je n'ai aucune idée de la raison pour laquelle le commentaire de l'analyse JSON est si difficile à comprendre - je l'ai étudié moi-même en plus d'étudier sw eng, je n'ai trouvé aucun bon tutoriel, ni de documentation concise sur GSON. Je vous remercie! – taeraeyttaejae

1

Vous pouvez analyser la chaîne JSON en utilisant par exemple GSON ci-dessous

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);