2015-04-03 17 views
5

Jestem nowy w rozwoju Androida i nowy w JSON. Korzystam z api mapy odległości w Google Maps. Mam pobrać plik JSON do JSONObject, jak sądzę (ukradłem kod, aby zrobić to z innego postu). Jednak nie mogę poprawnie analizować JSON. Pracowałem nad tym przez kilka dni i jestem całkowicie zakłopotany. Robię co następuje wezwanie do google poniżejParsowanie JSON z google maps DistanceMatrix api w Androidzie

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

Wyjście to:

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

Próbowałem:

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

próbowałem więcej, ale te wydają mi się one powinny działać. Wydawało mi się, że dla mnie wiersze to tablica, a elementy to także tablica. A zatem musiałbym pobrać wiersze z oryginalnego JSONObject, a następnie pobrać tablicę elementów z tablicy wierszy, a następnie pobrać obiekt odległości z tej tablicy, a na koniec uzyskać wartość tekstową i dodać ją do konstruktora ciągów I stworzony wcześniej. Czy popełniłem błąd? z góry dziękuję za pomoc.

+0

* Próbowałem prawie wszystkiego i utrzymuje rzucanie różnych wyjątków. *, A następnie pokażesz nam, co miał próbowałeś i co Wyjątkiem jesteś uzyskiwanie ... także przed zapytaniem google o te wyjątki ... – Selvin

+0

Edytowałem to, żeby pokazać część z nich. Zrobiłem Google wyjątki, ale nie sądziłem, że to ma jakiś sens. w pozycji 0 obiektu jsonArray nie jest tablicą.Jednak nie byłby to element będący tablicą? – eam1813

+0

'rows' to tablica, a następnie * pierwszy element * jest obiektem, a następnie' element' właściwość tego obiektu jest tablicą. then * pierwszy element * jest obiektem z właściwością 'distance' ... która jest obiektem ... który ma' własność text ... w 2 jesteś prawie na miejscu ... ale zapomniałeś o tablicy 'element'ów – Selvin

Odpowiedz

8

Oto co pracowali ze mną

//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]

Zakładając, mamy tylko jeden adres docelowy, a nie wielokrotność. Trochę manipulacji ciąg dostaje nam czystą ciąg znaków bez kodów "oraz nawiasy []

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