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

"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); } } 
  • Android: ¿Cómo puedo sincronizar datos del servidor a mi aplicación cada 3 y 5 minutos?
  • Incluir archivo .json local en el proyecto Eclipse Android
  • GSON. Cómo convertir json objeto a json array?
  • MultipartEntity y Json
  • Analizar matriz anidada dinámica en Android Retrofit
  • Análisis de la cadena JSON de la URL (RESTful webservice) mediante las bibliotecas GSON. Androide
  • Convertir XML a objeto JSON en Android
  • Cómo tomar array de json respuesta en java
  • Envío de objetos Json dentro del array al servidor
  • Permiso de la API de Youtube 403 Error prohibido
  • Beneficios de GSON sobre el análisis normal de JSON
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.