2015-04-03 2 views
5

Я новичок в разработке Android и новых для JSON. Я использую карту расстояния google maps api. Я уверен, что JSON загружается в JSONObject (я украл код, чтобы сделать это из другого сообщения). Однако я не могу правильно разобрать JSON. Я работаю над этим несколько дней, и я полностью в тупике. Я делаю следующий вызов Google нижеРазбор JSON с Google Maps DistanceMatrix api в android

https://maps.googleapis.com/maps/api/distancematrix/json?origins=1600%20pennsylvania%20avenue&destinations=1500%20college%20street&mode=driving&units=imperial 

Выход заключается в следующем:

{ 
    "destination_addresses" : [ "1500 College Street, Beaumont, TX 77701, USA" ], 
    "origin_addresses" : [ "1600 Pennsylvania Avenue, Hagerstown, MD 21742, USA" ], 
    "rows" : [ 
     { 
     "elements" : [ 
      { 
       "distance" : { 
        "text" : "1,306 mi", 
        "value" : 2102536 
       }, 
       "duration" : { 
        "text" : "18 hours 48 mins", 
        "value" : 67684 
       }, 
       "status" : "OK" 
      } 
     ] 
     } 
    ], 
    "status" : "OK" 
} 

Я попытался:

1.

JSONArray jsonArray = jObject.getJSONArray("rows"); 
JSONArray routes = jsonArray.getJSONArray(0); 
stringBuilder.append(routes.getJSONObject(0).getString("text")); 

2.

JSONArray jsonArray = jObject.getJSONArray("rows"); 
JSONObject routes = jsonArray.getJSONObject(0); 
stringBuilder.append(routes.getJSONObject("distance").getString("text")); 

3.

JSONArray jsonArray = jObject.getJSONArray("elements");     stringBuilder.append(routes.getJSONObject(0).getString("text")); 

я пытался больше, но те, мне кажется, что они должны работать. Мне казалось, что строки - это массив, а элементы - массив. Таким образом, мне нужно было бы получить строки из исходного JSONObject, а затем получить массив элементов из массива строк, а затем получить объект расстояния из этого массива, а затем, наконец, получить текстовое значение и добавить его в построитель строк I созданный ранее. Были ли я ошибаюсь? Спасибо заранее за любую помощь.

+0

* Я попробовал почти все, и он продолжает бросать различные исключения. *, То покажите нам, что если бы вы попробовали и то, что исключение вы получение ... также перед тем, как просить Google об этих исключениях ... – Selvin

+0

Я отредактировал его, чтобы показать некоторые из них. Я сделал исключения Google. Однако я не думал, что это имело какой-то смысл. Например, в случае, если одно говорит о вещи в позиции 0 объекта jsonArray не является массивом. Однако не будет ли это элементом, который является массивом? – eam1813

+0

'rows' - ​​это массив, тогда * первый элемент * - это объект, а затем свойство' elements' этого объекта это массив, тогда * первый элемент * является объектом с свойством 'distance' ... который является объектом ... который имеет' text' property ... в 2-м вы почти там ... но вы забыли о 'elements' array – Selvin

ответ

8

Вот что со мной работал

//httpResponse is the output of google api 
JSONObject jsonRespRouteDistance = new JSONObject(httpResponse) 
             .getJSONArray("rows") 
             .getJSONObject(0) 
             .getJSONArray ("elements") 
             .getJSONObject(0) 
             .getJSONObject("distance"); 

String distance = jsonRespRouteDistance.get("text").toString(); 

/* 
* For distance, below is only partial solution as the 
* output to string destination_addr will contain square brackets [] and double codes "" 
* Eg. [ "1600 Pennsylvania Avenue, Hagerstown, MD 21742, USA" ] 
* 
*/ 
String destination_addr = new JSONObject(httpResponse) 
          .get("destination_addresses") 
          .toString(); 

[UPDATE]

Предполагая, что у нас есть только один адрес получателя, а не несколько. Немного строка манипуляции получает нам строку строку чистой без кодов "и скобки []

StringBuilder stringBuilderDestinationAddr = new StringBuilder(); 

for (int i = 0; i < destination_addr.length(); i++) 
    if (destination_addr.charAt(i) != '[' && destination_addr.charAt(i) != ']' && destination_addr.charAt(i) != '"') 
     stringBuilderDestinationAddr.append(pickup_addr.destination_addr (i)); 

String strCleanDestination = stringBuilderDestinationAddr.toString(); 
Смежные вопросы