First time posting to stackoverflow, sorry if post format is wrong. wouldnt mind feedback on it if that helps with my question outlay.
Trying to receive the JSON from WU(Weather Underground).
This is the 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":"Brisbane, Australia",
"city":"Brisbane",
"state":"QNS",
"state_name":"Australia",
"country":"AU",
"country_iso3166":"AU",
"zip":"00000",
"magic":"15",
"wmo":"94576",
"latitude":"-27.46999931",
"longitude":"153.02999878",
"elevation":"14.0"
},
"observation_location":{
"full":"Liberte Weather, Brisbane, ",
"city":"Liberte Weather, Brisbane",
"state":"",
"country":"AU",
"country_iso3166":"AU",
"latitude":"-27.476187",
"longitude":"153.037369",
"elevation":"0 ft"
},
"estimated":{
},
"station_id":"IBRISBAN101",
"observation_time":"Last Updated on June 17, 4:07 PM AEST",
"observation_time_rfc822":"Sat, 17 Jun 2017 16:07:44 +1000",
"observation_epoch":"1497679664",
"local_time_rfc822":"Sat, 17 Jun 2017 16:08:10 +1000",
"local_epoch":"1497679690",
"local_tz_short":"AEST",
"local_tz_long":"Australia/Brisbane",
"local_tz_offset":"+1000",
"weather":"Mostly Cloudy",
"temperature_string":"71.6 F (22.0 C)",
"temp_f":71.6,
"temp_c":22.0,
"relative_humidity":"75%",
"wind_string":"From the WNW at 6.8 MPH",
"wind_dir":"WNW",
"wind_degrees":292,
"wind_mph":6.8,
"wind_gust_mph":0,
"wind_kph":10.9,
"wind_gust_kph":0,
"pressure_mb":"1016",
"pressure_in":"30.01",
"pressure_trend":"0",
"dewpoint_string":"63 F (17 C)",
"dewpoint_f":63,
"dewpoint_c":17,
"heat_index_string":"NA",
"heat_index_f":"NA",
"heat_index_c":"NA",
"windchill_string":"NA",
"windchill_f":"NA",
"windchill_c":"NA",
"feelslike_string":"71.6 F (22.0 C)",
"feelslike_f":"71.6",
"feelslike_c":"22.0",
"visibility_mi":"6.2",
"visibility_km":"10.0",
"solarradiation":"--",
"UV":"0",
"precip_1hr_string":"-999.00 in ( 0 mm)",
"precip_1hr_in":"-999.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/mostlycloudy.gif",
"forecast_url":"http://www.wunderground.com/global/stations/94576.html",
"history_url":"http://www.wunderground.com/weatherstation/WXDailyHistory.asp?ID=IBRISBAN101",
"ob_url":"http://www.wunderground.com/cgi-bin/findweather/getForecast?query=-27.476187,153.037369",
"nowcast":""
}
}
This is how im trying to call it and work with it:
public static void getJsonHttp() throws IOException, JSONException {
String output; // contains received JSON
String full; // city,country
String city; // city
String state; // state
String stateName; // state name
try {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpGet getRequest = new HttpGet(
"http://api.wunderground.com/api/<MY API KEY>/conditions/q/Australia/Brisbane.json");
getRequest.addHeader("accept", "application/json");
HttpResponse response = httpClient.execute(getRequest);
if (response.getStatusLine().getStatusCode() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatusLine().getStatusCode());
}
BufferedReader br = new BufferedReader(
new InputStreamReader((response.getEntity().getContent())));
while ((output = br.readLine()) != null) {
// System.out.println(output);
// System.out.println(br);
JSONObject jSon = new JSONObject(output.trim());
// System.out.println(jSon);
JSONObject fullJson = jSon.getJSONObject("version");
JSONObject currentObservation = fullJson.getJSONObject("current_observation");
JSONObject displayLocation = currentObservation.getJSONObject("display_location");
full = displayLocation.getString("full");
city = displayLocation.getString("city");
state = displayLocation.getString("state");
stateName = displayLocation.getString("state_name");
System.out.println(full);
System.out.println(city);
System.out.println(state);
System.out.println(stateName);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
With this current code I am getting this error:
Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:451)
at org.json.JSONObject.<init>(JSONObject.java:196)
at org.json.JSONObject.<init>(JSONObject.java:320)
at mainCommands.JsonConverter.getJsonHttp(JsonConverter.java:74)
at mainCommands.JsonConverter.main(JsonConverter.java:41)
If I change the JSONObject jSon = new JSONObject(output.trim());
to JSONObject jSon = new JSONObject(br);
I instead get the error:
Exception in thread "main" org.json.JSONException: JSONObject["version"] not found.
at org.json.JSONObject.get(JSONObject.java:472)
at org.json.JSONObject.getJSONObject(JSONObject.java:637)
at mainCommands.JsonConverter.getJsonHttp(JsonConverter.java:76)
at mainCommands.JsonConverter.main(JsonConverter.java:41)
If I change the JSONObject(br);
to JSONObject(br.readLine());
I get this error:
Exception in thread "main" org.json.JSONException: A JSONObject text must end with '}' at 2 [character 3 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:451)
at org.json.JSONObject.<init>(JSONObject.java:202)
at org.json.JSONObject.<init>(JSONObject.java:320)
at mainCommands.JsonConverter.getJsonHttp(JsonConverter.java:74)
at mainCommands.JsonConverter.main(JsonConverter.java:41)
both output
and br
give the same output when I print ln. its the exact same as the JSON above which im expecting.
I have also tried only calling "response", only calling "version", only calling "conditions" and "current observation" and since I cant see any [] i assume they arent JSONArray's.
The System.out.println(output)/(br)
are just in the code to test what prints out. and theyre both the same. except when I print output. there is a whitespace at the beginning that output.trim()
doesnt get rid of... so im always getting the must start with '{'
error.
I’m obviously misunderstanding the whole JSONObject/Array.get sequence. or something in the HttpRequest
isnt right. even though when I println the br
or output
it is what I’m expecting it to be.
I believe I have also gone through all stackoverflow threads about this aswell and tried all possible org.json answers.
found this one the most useful for different options but nothing worked:
JSONObject text must begin with '{'
open to all solutions but would like to stay within org.json, can get GSON if needed but surely i have just misunderstood the whole thing and its an easy fix..
EDIT:
System.out.println(br.readLine());
prints out the JSON perfect as expected.. but:
System.out.println(br);
prints out the following:
java.io.BufferedReader@3108bc
over and over again.
so:
JSONObject jSon = new JSONObject(br);
wouldnt find anything.
See Question&Answers more detail:
os