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
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"))
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"
},
I would like to get "lat" and "lng" from my JSON file and add to one array that keeps GeoPoint. I was trying to do it like that but it is not working for me :
protected List<GeoPoint> JsonArray(){
List<GeoPoint> endp = new ArrayList<GeoPoint>();
try{
JSONObject obj = new JSONObject(json);
JSONArray steps = obj.getJSONArray("routes");
for(int i=0;i<steps.length();i++){
JSONObject temp = steps.getJSONObject(i);
JSONObject ele = temp.optJSONObject("steps").optJSONObject("end_location");
ele.getJSONObject("lat");
ele.getJSONObject("lng");
double lat = Double.parseDouble(ele.getJSONObject("lat").toString());
double lng = Double.parseDouble(ele.getJSONObject("lng").toString());
endp.add(new GeoPoint((int)(lat *1E6),(int)(lng * 1E6)));
}
}catch (JSONException e) {
// TODO: handle exception
}
return endp;
}
Here's a part of how looks my JSON file:
{
"routes" : [
{
"bounds" : {
"northeast" : {
"lat" : 41.87999000000001,
"lng" : -87.615020
},
"southwest" : {
"lat" : 29.74674000000001,
"lng" : -95.361220
}
},
"copyrights" : "Dane do Mapy ©2013 Google",
"legs" : [
{
"distance" : {
"text" : "1 085 mil",
"value" : 1746457
},
"duration" : {
"text" : "16 godz. 39 min",
"value" : 59955
},
"end_address" : "1362 Chenevert Street, Houston, Teksas 77003, Stany Zjednoczone",
"end_location" : {
"lat" : 29.750110,
"lng" : -95.36016000000001
},
"start_address" : "138-230 South Columbus Drive, Chicago, Illinois 60601, Stany Zjednoczone",
"start_location" : {
"lat" : 41.87999000000001,
"lng" : -87.62075000000002
},
"steps" : [
{
"distance" : {
"text" : "338 stóp",
"value" : 103
},
"duration" : {
"text" : "1 min",
"value" : 9
},
"end_location" : {
"lat" : 41.88090,
"lng" : -87.62069000000001
},
"html_instructions" : "Kieruj się \u003cb\u003eS Columbus Dr\u003c/b\u003e na \u003cb\u003epółnoc\u003c/b\u003e w stronę \u003cb\u003eE Monroe St\u003c/b\u003e",
"polyline" : {
"points" : "}tr~FtlxuOuA#w##QMUA"
},
"start_location" : {
"lat" : 41.87999000000001,
"lng" : -87.62075000000002
},
"travel_mode" : "DRIVING"
},
{
"distance" : {
"text" : "0,2 mil",
"value" : 266
},
"duration" : {
"text" : "1 min",
"value" : 33
},
"end_location" : {
"lat" : 41.88086000000001,
"lng" : -87.61750000000001
},
"html_instructions" : "Skręć \u003cb\u003ew prawo\u003c/b\u003e w \u003cb\u003eE Monroe St\u003c/b\u003e",
"polyline" : {
"points" : "szr~FhlxuO?SAyA?_B#yA?iBAaB?WBE#C#A?C?A#A?C?y#?_#"
},
"start_location" : {
"lat" : 41.88090,
"lng" : -87.62069000000001
},
"travel_mode" : "DRIVING"
},
{
"distance" : {
"text" : "2,0 mil",
"value" : 3186
},
"duration" : {
"text" : "3 min",
"value" : 180
},
"end_location" : {
"lat" : 41.85320,
"lng" : -87.61470000000001
},
"html_instructions" : "Skręć \u003cb\u003ew prawo\u003c/b\u003e w \u003cb\u003eU.S. 41 S\u003c/b\u003e",
"polyline" : {
"points" : "kzr~FjxwuOpMOZ#`PO|ACvDC#?lDCZAfMGjAA`#Av#?^?P?N#P#j#LRFNDRJRHZRb#\\b#^nAjA##JJXXb#b#z#v#RRp#`#RLr#Xn#Np#J`A#bBOp#Kv#K#?#?#A#?#?#?#?PEvBWxB]fDq#xA]jF_BTIj#QpGuBd#OBAf#SrDyAPGNG#AVKbA_#~#]|#]z#Y`F{AtCy#fHyB"
},
"start_location" : {
"lat" : 41.88086000000001,
"lng" : -87.61750000000001
},
"travel_mode" : "DRIVING"
},
{
"distance" : {
"text" : "0,4 mil",
"value" : 581
},
"duration" : {
"text" : "1 min",
"value" : 30
},
"end_location" : {
"lat" : 41.848390,
"lng" : -87.614670
},
"html_instructions" : "Zjedź \u003cb\u003eInterstate 55 S\u003c/b\u003e w kierunku \u003cb\u003eSaint Louis\u003c/b\u003e",
"polyline" : {
"points" : "omm~FzfwuOVDPAN?VGlBk#b#M#?JEDAVI`A[dBi#`A[z#UPGZGf#E\\Ab##VDJBHBTFTHRJPNRNLL\\f#NXLTP\\BF"
},
"start_location" : {
"lat" : 41.85320,
"lng" : -87.61470000000001
},
"travel_mode" : "DRIVING"
},
Does anyone knows how can I do it in other way?
Your variable JSONArray steps = obj.getJSONArray("routes"); does not represent the "steps" part of the JSON object, but rather the "routes" part.
Also, you have skipped some of the levels in the JSON hierarchy. With the given JSON, you would need the following steps to traverse the JSON (I have omitted looping over the different arrays, except for the routes array)
JSONArray routes = obj.getJSONArray("routes");
for(int i=0; i < routes.length(); i++){
// Grab the first route
JSONObject route = routesArray.getJSONObject(i);
// Take all legs from the route
JSONArray legs = route.getJSONArray("legs");
// Grab first leg
JSONObject leg = legs.getJSONObject(0);
// Take all steps from the leg
JSONArray steps = leg.getJSONArray("steps");
// Grab first step
JSONObject step = steps.getJSONObject(0);
JSONObject endLocation = step.getJSONObject("end_location");
String lat = endLocation.getString("lat");
String lng = endLocation.getString("lng");
Reference: JSON parsing of Google Maps API in Android App
parse current json String as to get lat and lng :
JSONObject obj = new JSONObject(json);
JSONArray steps = obj.getJSONArray("routes");
for(int i=0;i<steps.length();i++){
JSONObject temp = steps.getJSONObject(i);
// get bounds JSONObject
JSONObject boundsjsonobj = temp.getJSONObject("bounds");
// get northeast JSONObject
JSONObject jsonboj_bounds_northeast= boundsjsonobj.getJSONObject("northeast");
// get northeast lng and lat
String str_northeast_lat=jsonboj_bounds_northeast.getString("lat");
String str_northeast_lng=jsonboj_bounds_northeast.getString("lng");
// get southwest JSONObject
JSONObject jsonboj_bounds_southwest= boundsjsonobj.getJSONObject("southwest");
// get northeast lng and lat
String str_southwest_lat=jsonboj_bounds_southwest.getString("lat");
String str_southwest_lng=jsonboj_bounds_southwest.getString("lng");
//get legs JsonArray from routes
JSONArray jsonarray_legs = temp.getJSONArray("legs");
for(int j=0;j<jsonarray_legs.length();j++){
JSONObject jobjlegs = jsonarray_legs.getJSONObject(j);
// get end_location json object
JSONObject jobjlegs_end_location = jobjlegs.getJSONObject("end_location");
String str_end_location_lat==jobjlegs_end_location.getString("lat");
String str_end_location_lng==jobjlegs_end_location.getString("lng");
// get start_address object
JSONObject jobjlegs_start_address = jobjlegs.getJSONObject("start_address");
String str_start_address_lat==jobjlegs_start_address.getString("lat");
String str_start_address_lng==jobjlegs_start_address.getString("lng");
// get steps jsonArray
JSONArray jsonarray_steps = jobjlegs.getJSONArray("steps");
for(int k=0;k<jsonarray_steps.length();k++){
JSONObject jobjsteps = jsonarray_steps.getJSONObject(k);
// get end_location jsonobject
JSONObject jobjsteps_end_location = jobjsteps.getJSONObject("end_location");
double latend = Double.parseDouble(jobjsteps_end_location.getString("lat"));
double lngend = Double.parseDouble(jobjsteps_end_location.getString("lng"));
endp.add(new GeoPoint((int)(latend *1E6),(int)(lngend * 1E6)));
// get start_location jsonobject
JSONObject jobjsteps_start_location = jobjsteps.getJSONObject("start_location");
double latstart = Double.parseDouble(jobjsteps_start_location.getString("lat"));
double lngstart = Double.parseDouble(jobjsteps_start_location.getString("lng"));
}
}
}
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);
}