我试图在我的android程序中解析谷歌方向api的JSON响应。这是下面的请求链接。我在这里跳过JSON响应,因为它太长而且只需点击链接即可显示它。
我的解析响应的代码:
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
答案 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");
}
}