2011-08-29 30 views
8

Yön zamanlarını almak için google maps API'yi kullanmaya çalışıyorum. Bir url oluşturmayı, JSON yanıtını almayı ve ardından bu yanıtı seyahat süresi için incelemeyi umuyorum. JSON nesnesini oluşturduktan sonra, gezinirken sorun yaşıyorum. Bana göre bu, yanıtı almamı ya da JSON nesnesinde dolaştığımı gösteriyor. Web'in etrafındaki eğiticilerden bir araya getirdiğim kodlara ve parça parçalarına göz atabilirseniz çok memnun olurum.Android App içinde Google Maps API ayrıştırma JSON

Bu kod yanıtı almak için tasarlanmıştır. Bir try/catch ile çevrilidir ve herhangi bir hatayı tetiklememiştir. Benzer bir soru için this stackoverflow answer esinlenerek olarak

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

bu kod, süresini bu çıktıyı alıp nihai dizeye ayrıştırmak için tasarlanmıştır.

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

İkinci bloğun ikinci satırında bir JSON istisnası alıyorum. Bunu düzeltmek için herkes yardımcı olabilir mi? Ya da aynı verileri elde etmenin daha basit bir yolunu önerebilir misiniz?

DÜZENLEME:

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

Ama yine de JSON istisna atıyor, ancak şimdi üçüncü satırdan sonra açıklanmıştır: Burada (aromero itibaren) ilk yardımcı yanıt sayesinde, ikincisi yarısı şimdi benziyor . Emin olmak için utanç verici bir şekilde kolay olduğundan eminim, ama bazı yardımları gerçekten takdir ediyorum.

bir örnek JSON dosyasına ilgili kısmı, aşağıda gösterilmiştir:

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

cevap

14

"rota", aynı zamanda bir dizi getJSONArray

"bacaklar" yerine, getJSONObject kullanmak yerine, bir dizidir.

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

Sana yanlış yapıyorum tespit ettik düşünüyorum. Hala özellikleri dışarı ütüleme. Birisi beni dövmedikçe, tamir ettiğimde geri göndereceğim. – user714403

+0

Rotalar bir dizidir, google'un olası rotaların bir listesini döndürdüğünü varsayalım. Yani onlardan birini almalısın ya da hepsinde bir şey yapmalısın. Ne yapmaya çalışıyorsun? – aromero

+0

Harika! Orijinal cevabınıza yaptığınız değişiklik için teşekkür ederim, el ele tutuşmasını gerçekten takdir ediyorum. JSON'un sözdizimini/aralığını gerçekten anlamadım ve onu çok net bir şekilde ortaya koydun. Çok teşekkürler! – user714403

2

Android'de Google'ın Yön Api'yi kullanmaya da çalışıyordum. Bu yüzden bunu yapabilmek için açık kaynak kodlu bir proje hazırladım. Burada bulabilirsiniz: https://github.com/MathiasSeguy-Android2EE/GDirectionsApiUtils

Nasıl Çalışır, kesinlikle sadece:

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); 
    } 
} 
+0

Tüm kodunuzu Github'tan ticari uygulamamdan uygulamaya geçirmem mümkün mü? –