0

I am trying to run a Telegram bot that returns current weather (with help of user's detected ip from another function), but the JSON parsing does not work properly. I get "Exception in thread "null Telegram Executor" java.lang.StackOverflowError" from last row before return. Another approach to this yielded "null pointer exception", where i followed a example from here.

Any way to parse a JSON with java and GSON?

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

The JSON response looks like this, i only need the "weather" key:

{
  "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":""
  }
}
1
  • You could save the json output in a file and just try parsing the data from that file. The exception "null Telegram Executor" looks irrelevant to JSON parsing. Commented Oct 19, 2017 at 18:37

2 Answers 2

3

Your StackOverflowError is a result of trying to serialise the root gson JsonObject as json with a second library (the org.json.JSONObject wrapper):

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

You've already parsed the file with gson and can use its API to find the node you want:

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

If you want to pretty-print a node with gson you can do it like this:

Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(rootobj);
System.out.println(json); 
Sign up to request clarification or add additional context in comments.

1 Comment

This worked flawlessly! I have no idea why the consept of parsing JSON is so hard to understand - i have been studying this myself besides studying sw eng, i haven't found any good tutorial, nor concise documentation about GSON. Thank you!
1

You can parse the JSON string using GSON example below

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.