My json link to json
This is the code to fetch the items. I am getting the error while fetching the photo_reference. I know that photos is a JSONarray and inside that a JSONobject is there. The error is that it shows as no value for photos. how to get the array and how to fetch the photo_reference string? I'm new to JSON and this is quite difficult for me. Log cat is also shared. Thank you in advance.
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("results");
for (int i = 0; i<array.length();i++)
{
//get the photo reference from json of google place web api
JSONObject o = array.getJSONObject(i);
Places item = new Places();
JSONArray photo = o.getJSONArray("photos");
JSONObject photos = photo.getJSONObject(0);
String ph_ref = photos.getString("photo_reference");
String id = o.getString("id");
String name = o.getString("name");
if (o.has("rating")) {
String rat = o.getString("rating");
item.setRating(rat);
}else{
item.setRating("0");
}
org.json.JSONException: No value for photos
Logcat
org.json.JSONException: No value for photos
at org.json.JSONObject.get(JSONObject.java:389)
at org.json.JSONObject.getJSONArray(JSONObject.java:584)
UPDATE
MY SOLUTION
if (o.has("photos")){
JSONArray photo = o.getJSONArray("photos");
JSONObject photos = photo.getJSONObject(0);
String ph_ref = photos.getString("photo_reference");
item.setPh_ref(ph_ref);
}
else
item.setPh_ref("no photos available");
Some items doesn't have the photos object in the json.
So you need to check the photo object,
JSONArray photo = o.getJSONArray("photos");
if(photo != null) {
JSONObject photos = photo.getJSONObject(0);
}
Some of the items just don't have "photos" inside. One of them is:
{
"geometry" : {
"location" : {
"lat" : 26.1744046,
"lng" : 91.7769246
},
"viewport" : {
"northeast" : {
"lat" : 26.1757411802915,
"lng" : 91.7782234802915
},
"southwest" : {
"lat" : 26.1730432197085,
"lng" : 91.77552551970849
}
}
},
"icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/lodging-71.png",
"id" : "f66820fca7c21cb6783fe27a996af3379ed7140e",
"name" : "OYO 5332 Parnil Palace",
"place_id" : "ChIJ0S48-Z5ZWjcRBXSBd8gS9q4",
"rating" : 4.5,
"reference" : "CmRSAAAAlzfMwWtNWJb8fFFyzsqNBxyZgbfbR4IPZLP2qQVph1NBgZqEwolpKNc7rRXBAQVFX4ph31iYvCrFM77v5QqDY8gEIWHBJMdW9vqWSiMlDCDF-_r6N4AUviMXwH6xTq64EhAFOGo0wihXKEy8GPtQayxiGhS6SNxnJ6DI58p9uwhSek-ov2pLJA",
"scope" : "GOOGLE",
"types" : [ "lodging", "point_of_interest", "establishment" ],
"vicinity" : "Zoo Road, Zoo Tiniali, Guwahati"
},
Related
I need to extract the location type from where I am on the map for example from the following JSON :
(I deleted some of the irrelevant information in the fields)
{ "html_attributions" : [],
"results" : [
{ "business_status" : "OPERATIONAL", "geometry" :
{ "location" : { "lat" : 31.7895094,"lng" : 34.6444928},
"viewport" :
{"northeast" : {"lat" : 31.790,"lng" : 34.645}, "southwest" : {"lat" : 31.788,"lng" : 34.643} } },
"icon_mask_base_uri" : "",
"name" : "",
"opening_hours" : {"open_now" : true },
"photos" : [ { "height" : 709,
"html_attributions" : [],
"photo_reference" : "", "width" : 960 }],
"place_id" : "",
"plus_code" : {"compound_code" : "QJQV+RQ Ashdod, Israel",
"global_code" : "8G3PQJQV+RQ"},
"rating" : 3.9,
"reference" : "","scope" : "GOOGLE",
"types" : [ "electrician", "point_of_interest", "establishment" ],
"user_ratings_total" : 18,
"vicinity" : ""}],
"status" : "OK"}
I'm having trouble because the location type can be empty or can be a single location or can be several location types that come in an array.
The cases I need to handle:
If it's an array, I want only the first type (as in the attached example)
If it is a single location I want to extract it
If there is no location do not try to extract a location type at all
In the example above i need extract only "electrician" from types
This is how my code looks without extracting the types field:
public class FetchData extends AsyncTask<Object,String,String> {
String googleNearByPlacesData ;
GoogleMap googleMap;
String url;
String temp;
#Override
protected void onPostExecute(String s) {
//This is the exampale print
Log.d("json?" ,s);
try{
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray = jsonObject.getJSONArray("results");
for (int i= 0 ; i < jsonArray.length() ; i++){
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
JSONObject getLocation = jsonObject1.getJSONObject("geometry").
getJSONObject("location");
String lat = getLocation.getString("lat");
String lng = getLocation.getString("lng");
JSONObject getName = jsonArray.getJSONObject(i);
String name = getName.getString("name");
LatLng latLng = new LatLng(Double.parseDouble(lat),Double.parseDouble(lng));
MarkerOptions maekerOptions = new MarkerOptions();
maekerOptions.title(name);
maekerOptions.position(latLng);
googleMap.addMarker(maekerOptions);
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,15));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
I am trying to read Values For Nearest Hospitals.
I am using google api and here is the return.
At first I was not reading latitude and longitude. Then the application would work fine. Now I read lat lang but i get data.size = 0;
{
"results" : [
{
"geometry" : {
"location" : {
"lat" : 33.7724766,
"lng" : 72.8127372
},
"viewport" : {
"northeast" : {
"lat" : 33.7739632802915,
"lng" : 72.8141296802915
},
"southwest" : {
"lat" : 33.7712653197085,
"lng" : 72.81143171970849
}
}
},
"icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/doctor-71.png",
"id" : "d05b6a41509c0b6dac573a6aa18453ab5ca6801e",
"name" : "HMC Female Dispensary",
"place_id" : "ChIJ_ddd9iyk3zgR32HNTt2Uhqw",
"plus_code" : {
"compound_code" : "QRC7+X3 Taxila, Pakistan",
"global_code" : "8J5JQRC7+X3"
},
"reference" : "ChIJ_ddd9iyk3zgR32HNTt2Uhqw",
"scope" : "GOOGLE",
"types" : [ "hospital", "health", "point_of_interest", "establishment" ],
"vicinity" : "Taxila"
}
Here is my code:
JSONObject obj = new JSONObject(new String(responseBody));
Log.e("Error", obj.toString());
JSONArray array = obj.getJSONArray("results");
for (int i = 0; i < array.length(); i++) {
JSONObject newobj = array.getJSONObject(i);
final Hospital hospital = new Hospital();
hospital.setId(newobj.getString("id"));
hospital.setName(newobj.getString("name"));
hospital.setPlace_id(newobj.getString("place_id"));
// hospital.setPhone_num();
if (newobj.has("rating"))
hospital.setRating(Double.parseDouble(newobj.getString("rating")));
hospital.setVicinity(newobj.getString("vicinity"));
JSONArray geometry = newobj.getJSONArray("geometry");
for (int j = 0; j < geometry.length(); j++) {
JSONObject jsonnewtwo = geometry.getJSONObject(j);
JSONArray location = jsonnewtwo.getJSONArray("location");
for (int k = 0; k < location.length(); k++) {
//get DATA here
JSONObject latlang = location.getJSONObject(k);
hospital.setLat(Double.parseDouble(latlang.getString("lat")));
hospital.setLng(Double.parseDouble(latlang.getString("lng")));
Log.e("hos", hospital.getLat() + "");
}
}
data.add(hospital);
Toast.makeText(MapsActivity.this , "Added" , Toast.LENGTH_LONG).show();
If i dont read lat and lang , then it works fine but if i read inner arrays using above method , the size of Arraylist data is 0.
What is issue?
geometry is a Json Object and you are trying to convert it to JSONArray. Check this line. JSONArray geometry = newobj.getJSONArray("geometry");
JSONObject geometry = newobj.getJSONObject("geometry");
JSONObject location = geometry.getJSONObject("location");
Log.w("Latitude", location.getString("lat"))
Log.w("Longitude", location.getString("lng"))
The Problem I seem to be having is accessing the "deeper level" lat lng values from within the json file.
The Json file is being accessed live from google with this type of link:
https://maps.googleapis.com/maps/api/place/nearbysearch/json?
Here is what a single object/array item looks like in json, including the "top Level" "results".
"results" : [
{
"geometry" : {
"location" : {
"lat" : 55.4628609,
"lng" : -4.6299348
},
"viewport" : {
"northeast" : {
"lat" : 55.46420472989273,
"lng" : -4.628674020107278
},
"southwest" : {
"lat" : 55.46150507010728,
"lng" : -4.631373679892723
}
}
},
"icon" : "https://maps.gstatic.com/mapfiles/place_api/icons/shopping-71.png",
"id" : "0655ceeeddd83f1a901bcef361b22cbfa951ae73",
"name" : "GAME",
"opening_hours" : {
"open_now" : false
},
"place_id" : "ChIJM8hBpZ3WiUgRuWc3KhfMJys",
"plus_code" : {
"compound_code" : "F97C+42 Ayr, UK",
"global_code" : "9C7QF97C+42"
},
"rating" : 4.2,
"reference" : "ChIJM8hBpZ3WiUgRuWc3KhfMJys",
"scope" : "GOOGLE",
"types" : [ "electronics_store", "store", "point_of_interest", "establishment" ],
"vicinity" : "120 High St, Ayr"
},
Here is the Method im using to access the json file data after it has been parsed to string.
void createMarkersFromJson(String json) throws JSONException {
JSONObject object = new JSONObject(json);
JSONArray jsonArray = object.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
map.addMarker(new MarkerOptions()
.title(jsonObj.getString("name"))
.position(new LatLng(
jsonObj.getJSONArray("geometry").getDouble(0),
jsonObj.getJSONArray("geometry").getDouble(1)
))
);
}
}
Geometry is not an array. JSON that begins with CURLY BRACE {} is an object while BRACKET [ ] indicates an array. Try this one.
JSONArray jsonArray= object.getJSONArray("results");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObj = jsonArray.getJSONObject(i);
JSONObject locationObj = jsonObj .getJSONObject("geometry")
.getJSONObject("location");
map.addMarker(new MarkerOptions()
.title(jsonObj.getString("name"))
.position(new LatLng(
locationObj.getDouble("lat"),
locationObj.getDouble("lng")
))
);
}
Hope this helps you clarify difference between JSON array and object, and how to access them. Cheers
I am new to android programming and i would like to know how do i get a certain object from a JSONarray.
My JSON looks like this:
{"results" : [
{
"address_components" : [
{
"long_name" : "Contern",
"short_name" : "Contern",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Luxembourg",
"short_name" : "Luxembourg",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Luxembourg",
"short_name" : "LU",
"types" : [ "country", "political" ]
}
],
"formatted_address" : "Contern, Luxembourg",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 49.621830,
"lng" : 6.302790
},
"southwest" : {
"lat" : 49.56759010,
"lng" : 6.195380
}
},
"location" : {
"lat" : 49.58515930,
"lng" : 6.2274880
},
and i want to extract the lat and lng from location.
my code is:
arr = json.getJSONArray("results");
JSONObject location=arr.getJSONObject(4);
double lng = location.getDouble("lng");
double lat = location.getDouble("lat");
I wanted to say that your json file is wrong but after closer look I think your code is bad :) I suppose it doesn't give you want you want now.
"results" in this case is JsonArray - but an array of full JsonObjects, not it's properties!
Full JsonObject is object with - address_components, format_address, geometry etc. "location" is also a part of "geometry" object.
When you are sure there will be only one object in "result" array - you can do:
arr = json.getJSONArray("results");
if (arr.length() > 0){
JSONObject resultObject = arr.getJSONObject(0);
JSONObject geometry = resultObject.getJSONObject("geometry");
JSONObject location = geometry.getJSONObject("location");
double lng = location.getDouble("lng");
double lat = location.getDouble("lat");
}
When you have more than 1 object in result - I suppose you need to loop over them and find what you need.
Hello Refer below code
JSON String
{
"result": "success",
"countryCodeList":
[
{"countryCode":"00","countryName":"World Wide"},
{"countryCode":"kr","countryName":"Korea"}
]
}
Here below I am fetching country details
JSONObject json = new JSONObject(jsonstring);
JSONArray nameArray = json.names();
JSONArray valArray = json.toJSONArray(nameArray);
JSONArray valArray1 = valArray.getJSONArray(1);
valArray1.toString().replace("[", "");
valArray1.toString().replace("]", "");
int len = valArray1.length();
for (int i = 0; i < valArray1.length(); i++) {
Country country = new Country();
JSONObject arr = valArray1.getJSONObject(i);
country.setCountryCode(arr.getString("countryCode"));
country.setCountryName(arr.getString("countryName"));
arrCountries.add(country);
}
I am new to android json i want put the req and get the response from the google matrix api server in android i want send the req :
http://maps.googleapis.com/maps/api/distancematrix/json?origins=Hyderabad,Andhra%20Pradesh,India&destinations=Eluru,Andhra%20pradesh,India&mode=driving&language=fr-FR&sensor=false
and that url returs the output is as fallows i want extract the km value from that result. :
{
"destination_addresses" : [ "Eluru, Andhra Pradesh, Inde" ],
"origin_addresses" : [ "Hyderabad, Andhra Pradesh, Inde" ],
"rows" : [
{
"elements" : [
{
"distance" : {
"text" : "330 km",
"value" : 330316
},
"duration" : {
"text" : "5 heures 1 minute",
"value" : 18052
},
"status" : "OK"
}
]
}
],
"status" : "OK"
}
How to get the distance value and print in the app console?
In the Following shown way you can retrieve the km from your JSON Output.
JSONObject jobj = new JSONObject(your result);
JSONObject json;
json = jobject;
JSONArray jrowsArray = json.getJSONArray("rows");
for(int i=0;i<jrowsArray.length;i++){
JSONArray jElementsArray = jrowsArray.getJSONArray("elements");
for(int j=0;j<jElementsArray.length;j++){
JSONObject jDistance = jElementsArray.getJSONObject("distance");
String distancekm = jDistance.getString("text");
}
}