Análisis de JSON de la API de Google Maps en la aplicación para Android

Estoy tratando de usar la API de google maps para buscar tiempos de dirección. Estoy esperando para crear una url, obtener la respuesta JSON, y luego examinar esa respuesta para la duración del viaje. Después de crear el objeto JSON, tengo problemas para navegar por él. Para mí, esto indica que he estropeado hasta obtener la respuesta o navegar por el objeto JSON. Le agradecería que pudiera echar un vistazo a los pedazos de código que he cosido juntos de tutoriales en la web.

Este código está destinado a obtener la respuesta. Está rodeado por un try / catch y no ha desencadenado ningún error.

String stringUrl = <URL GOES HERE>; URL url = new URL(stringUrl); HttpURLConnection httpconn = (HttpURLConnection)url.openConnection(); if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) { BufferedReader input = new BufferedReader(new InputStreamReader(httpconn.getInputStream()),8192); String strLine = null; while ((strLine = input.readLine()) != null) { response.append(strLine); } input.close(); } String jsonOutput = response.toString(); 

Este código está destinado a tomar esa salida y analizarla en la cadena final, la duración, como se inspira en esta respuesta stackoverflow para una pregunta similar.

  JSONObject jsonObject = new JSONObject(jsonOutput); JSONObject routeObject = jsonObject.getJSONObject("routes"); JSONObject legsObject = routeObject.getJSONObject("legs"); JSONObject durationObject = legsObject.getJSONObject("duration"); String duration = durationObject.getString("text"); 

Estoy captando una excepción JSON en la segunda línea del segundo bloque. ¿Puede alguien ayudar a arreglar esto? ¿O tal vez sugerir una forma más sencilla de obtener los mismos datos?

EDIT: gracias a la primera respuesta útil aquí (de aromero), la segunda mitad ahora se ve como:

  JSONObject jsonObject = new JSONObject(responseText); JSONArray routeObject = jsonObject.getJSONArray("routes"); JSONArray legsObject = routeObject.getJSONArray(2); ***error*** JSONObject durationObject = legsObject.getJSONObject(1); String duration = durationObject.getString("text"); 

Pero todavía está lanzando una excepción JSON, sólo que ahora es después de la tercera línea. Estoy seguro de que esto es vergonzosamente fácil de arreglar, pero realmente agradecería alguna ayuda.

La parte relevante de un ejemplo de archivo JSON se muestra a continuación:

 { "routes" : [ { "bounds" : { "northeast" : { "lat" : 34.092810, "lng" : -118.328860 }, "southwest" : { "lat" : 33.995590, "lng" : -118.446040 } }, "copyrights" : "Map data ©2011 Google", "legs" : [ { "distance" : { "text" : "12.9 mi", "value" : 20807 }, "duration" : { "text" : "27 mins", "value" : 1619 }, 

2 Solutions collect form web for “Análisis de JSON de la API de Google Maps en la aplicación para Android”

"Rutas" es una matriz, en lugar de usar getJSONObject , use getJSONArray

"Piernas" es un arreglo también.

 JSONObject jsonObject = new JSONObject(responseText); // routesArray contains ALL routes JSONArray routesArray = jsonObject.getJSONArray("routes"); // Grab the first route JSONObject route = routesArray.getJSONObject(0); // Take all legs from the route JSONArray legs = route.getJSONArray("legs"); // Grab first leg JSONObject leg = legs.getJSONObject(0); JSONObject durationObject = leg.getJSONObject("duration"); String duration = durationObject.getString("text"); 

También estaba tratando de usar la dirección Api de Google en Android. Así que hice un proyecto de código abierto para ayudar a hacer eso. Puede encontrarlo aquí: https://github.com/MathiasSeguy-Android2EE/GDirectionsApiUtils

Cómo funciona, sin duda, simplemente:

 public class MainActivity extends ActionBarActivity implements DCACallBack{ /** * Get the Google Direction between mDevice location and the touched location using the Walk * @param point */ private void getDirections(LatLng point) { GDirectionsApiUtils.getDirection(this, startPoint, endPoint, GDirectionsApiUtils.MODE_WALKING); } /* * The callback * When the directions is built from the google server and parsed, this method is called and give you the expected direction */ @Override public void onDirectionLoaded(List<GDirection> directions) { // Display the direction or use the DirectionsApiUtils for(GDirection direction:directions) { Log.e("MainActivity", "onDirectionLoaded : Draw GDirections Called with path " + directions); GDirectionsApiUtils.drawGDirection(direction, mMap); } } 
  • Establecer Retrofit RestAdapter.LogLevel a algo que no sea FULL produce un cuerpo de respuesta vacía
  • Sugerencias de búsqueda de recursos de red en el cuadro Búsqueda rápida
  • Android - cómo analizar json con el objeto en el índice
  • Cómo obtener objeto JSON sin convertir en Retrofit 2.0?
  • Cómo obtener valores json array en android?
  • Lectura de un Json Array en android
  • Twitter JSON API en el desarrollo de Android
  • Análisis de la matriz JSON con una sub-matriz con GSON?
  • Convención de nomenclatura con la serialización / deserialización de Firebase?
  • Cómo convertir json objeto en cadena en android ..?
  • Diferentes formas de publicar valores json en Server
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.