从谷歌方向api解析json响应

时间:2014-02-20 03:59:26

标签: android json google-maps parsing response

我试图在我的android程序中解析谷歌方向api的JSON响应。这是下面的请求链接。我在这里跳过JSON响应,因为它太长而且只需点击链接即可显示它。

http://maps.googleapis.com/maps/api/directions/json?origin=Windsor&destination=Leamington&sensor=false&avoid=highways&mode=walking

我的解析响应的代码:

try {
    JSONObject responseObject = (JSONObject) new JSONTokener(responseString).nextValue();
    this.responseString = responseObject.getString("status") ;
    JSONArray routesArray = responseObject.getJSONArray("routes");
    JSONObject route = routesArray.getJSONObject(0);
    JSONArray legs ;
    JSONObject leg ;
    JSONArray steps ;
    JSONObject dist;
    Integer distance ;
    if(route.has("legs")) {
        legs = route.getJSONArray("legs");
        leg = legs.getJSONObject(0) ;
        steps = leg.getJSONArray("steps"); // EDIT : I had somehow missed this line before when copying the code from IDE to the website
        int nsteps = steps.length() ;
        for(int i=0;i<nsteps;i++) {
        JSONObject step = steps.getJSONObject(i);
            if(step.has("distance")) {
                dist = (JSONObject) step.get("distance");// throws exception
                //I would like to take the distance value and do something with it
                //if(dist.has("value"))
                //  distance = (Integer) dist.get("value") ;
            }
        }
    }
    else
        this.responseString = "not found" ;
} catch ( Exception e) {
    e.printStackTrace() ;
}

这会引发异常(再次跳过,因为JSON响应太大。堆栈跟踪显示整个响应字符串):

org.json.JSONException: Expected ':' after polyline at character 13837 of {
    "routes" : [
       {
          "bounds" : {
             "northeast" : { ....

我尝试使用getJSONObject函数代替get,但我得到了同样的例外。

dist = step.getJSONObject("distance");

任何人都可以通过指出我在这里缺少什么来帮助我吗?我对android上的parsin JSON还不是很熟悉,所以我很可能在某个地方犯了一个愚蠢的错误。感谢。

此网站上的另一篇类似帖子,但不完全相同:JSON parsing of Google Maps API in Android App

3 个答案:

答案 0 :(得分:1)

由于你不太熟悉,我建议使用Gson解析JSON,esp用于复杂的响应。案件适用于您的情况。

我使用Gson解析来自Google Maps API,Places API等的响应......

使用Gson解析,映射数据和模型类可能会更好。例如:

    Gson gson = new Gson();
    ModelClass modelClass= new ModelClass(); //or ArrayList<ModelClass>
    modelClass= gson.fromJson(responseContent,ModelClass.class); 
//where responseContent is your jsonString
    Log.i("Web service response", ""+modelClass.toString());

https://code.google.com/p/google-gson/

对于命名差异(根据webservice中的变量),可以使用注释等 @SerializedName。 (所以不需要使用Serializable)

您可以使用for-each循环并验证或操作模型类中的数据。

for(Modelclass object: modelClass.getList()) {
}

http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

How does the Java 'for each' loop work?

此外,尽可能使用for-each而不是for(;;)。

检查这些:
Parsing data with gson from google places
http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html
How to parse google places json

我正在研究相同的API,认为这对模型类也有帮助:
Displaying multiple routes using Directions API in Android

答案 1 :(得分:0)

您的for循环永远不会为step设置值 - 您是否错过了一行

step = steps.getJSONObject(i);

位于for循环的顶部?

答案 2 :(得分:0)

试试这个..

    steps = leg.getJSONArray("steps");
    int nsteps = steps.length() ;
    for(int i=0;i<nsteps;i++) {
        if(steps.has("distance")) {
            JSONObject new_onj = steps.getJSONObject(i);
            dist = new_onj.getJSONObject("distance");       
            if(dist.has("value"))
               distance = (Integer) dist.get("value");
        }
    }