2011-08-29 49 views
8

Tôi đang cố gắng sử dụng API bản đồ google để tìm nạp thời gian chỉ đường. Tôi hy vọng sẽ tạo một url, nhận được phản hồi JSON và sau đó kiểm tra phản hồi đó cho thời lượng di chuyển. Sau khi tôi tạo đối tượng JSON, tôi gặp khó khăn khi điều hướng nó. Đối với tôi, điều này cho thấy rằng tôi đã hoặc đang rối tung lên nhận phản hồi hoặc điều hướng đối tượng JSON. Tôi rất cảm kích nếu bạn có thể nhìn vào các bit và đoạn mã tôi đã ghép lại với nhau từ các hướng dẫn trên web.Phân tích JSON API Google Maps trong Ứng dụng Android

Mã này nhằm mục đích nhận phản hồi. Nó được bao quanh bởi một try/catch và nó đã không gây ra bất kỳ lỗi nào.

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

Mã này được thiết kế để có đầu ra và phân tích nó vào chuỗi thức, thời gian, như lấy cảm hứng từ this stackoverflow answer cho một câu hỏi tương tự.

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

Tôi đang bắt ngoại lệ JSON trên dòng thứ hai của khối thứ hai. Bất cứ ai có thể giúp đỡ để sửa lỗi này? Hoặc có lẽ đề xuất một cách đơn giản hơn để có được cùng một dữ liệu?

EDIT: nhờ vào các câu trả lời hữu ích đầu tiên ở đây (từ aromero), nửa cuối bây giờ trông giống như:

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

Nhưng nó vẫn là ném một ngoại lệ JSON, chỉ bây giờ nó sau dòng thứ ba . Tôi chắc chắn điều này là dễ dàng để sửa chữa, nhưng tôi thực sự sẽ đánh giá cao một số trợ giúp.

Phần liên quan của một ví dụ tệp JSON được hiển thị dưới đây:

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

Trả lời

14

"đường" là một mảng, thay vì sử dụng getJSONObject, sử dụng getJSONArray

"chân" là một mảng cũng có.

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

Tôi nghĩ rằng bạn đã xác định được những gì tôi đang làm sai. Vẫn đang ủi các chi tiết cụ thể. Tôi sẽ đăng lại khi tôi sửa nó, trừ khi ai đó đánh tôi với nó. – user714403

+0

Tuyến đường là một mảng, tôi cho rằng google đang trả lại cho bạn danh sách các tuyến đường có thể. Vì vậy, bạn cần phải lấy một trong số họ, hoặc làm một cái gì đó trên tất cả chúng. Bạn đang cố làm gì vậy? – aromero

+0

Tuyệt vời! Cảm ơn bạn đã chỉnh sửa câu trả lời gốc của mình, tôi thực sự đánh giá cao việc nắm tay. Tôi thực sự không hiểu cú pháp/khoảng cách của JSON và bạn đã làm cho nó rõ ràng tuyệt vời. Cảm ơn nhiều! – user714403

2

Tôi cũng đang cố gắng sử dụng Hướng Api của Google trong Android. Vì vậy, tôi đã tạo một dự án nguồn mở để giúp thực hiện điều đó. Bạn có thể tìm thấy nó ở đây: https://github.com/MathiasSeguy-Android2EE/GDirectionsApiUtils

Làm thế nào nó hoạt động, chắc chắn là đơn giản:

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ôi có thể triển khai toàn bộ mã từ Github đến ứng dụng thương mại của mình không? –

Các vấn đề liên quan