Анализ JSON API Карт Google в приложении для Android - PullRequest
10 голосов
/ 30 августа 2011

Я пытаюсь использовать API карт Google для получения времени направления. Я надеюсь создать URL-адрес, получить ответ JSON, а затем изучить этот ответ на предмет длительности поездки. После создания объекта JSON у меня возникают проблемы при навигации по нему. Для меня это означает, что я либо испортил получение ответа, либо перемещался по объекту JSON. Я был бы признателен, если бы вы могли взглянуть на фрагменты кода, которые я собрал из учебных пособий в Интернете.

Этот код предназначен для получения ответа. Он окружен попыткой / уловом и не вызывает никаких ошибок.

      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();

Этот код предназначен для того, чтобы взять эти выходные данные и проанализировать их в итоговую строку, длительность, как вдохновлено этим ответом stackoverflow для аналогичного вопроса.

        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");

Я ловлю исключение JSON во второй строке второго блока. Кто-нибудь может помочь исправить это? Или, возможно, предложить более простой способ получить те же данные?

РЕДАКТИРОВАТЬ: благодаря первому полезному ответу (от aromero) вторая половина теперь выглядит следующим образом:

    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");

Но он по-прежнему вызывает исключение JSON, только теперь это после третьей строки. Я уверен, что это легко исправить, но я был бы очень признателен за помощь.

Соответствующая часть примера файла JSON показана ниже:

{
   "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 ]

15 голосов
/ 30 августа 2011

«маршруты» - это массив, вместо использования getJSONObject, используйте getJSONArray

«ноги» также является массивом.

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");
2 голосов
/ 13 сентября 2013

Я также пытался использовать Direction Api Google в Android. Поэтому я сделал проект с открытым исходным кодом, чтобы помочь сделать это. Вы можете найти его здесь: https://github.com/MathiasSeguy-Android2EE/GDirectionsApiUtils

Как это работает, определенно просто:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...