json解析到listview(爱帮公交demo)

转载自:http://www.chenwg.com/android/json%e8%a7%a3%e6%9e%90%e5%88%b0listview.html

本项目是使用爱帮公交提供的SDK作为我们开发的基础,通过输入公交路线,发送到远程服务器,接着远程服务器返回一个json格式的结果数据,我再将这个json格式的结果数据解析到listview控件里。


(1)首先先去申请API KEY, 爱帮的API的网址:http://www.aibang.com/api/

(2)了解下爱帮API,爱帮返回的数据有两种格式,一种是xml,另一种是json,这次只是讲json的解析,这次实现的功能模块是“公交线路查询”

来了解一个url:http://openapi.aibang.com/bus/lines?app_key=f41c8afccc586de03a99c86097e98ccb&city=%E5%B9%BF%E5%B7%9E&q=b25

将这条url放在浏览器里访问,将会返回如下的数据:

显然上面的是xml格式的数据,只要在url后面加上”&alt=json”,即可返回json格式的数据。

这条url的参数说明如下:


返回的数据的说明:




详细请查看 :http://www.aibang.com/api/usage#bus_lines

(3)下载爱帮公交SDK,解压后有两个文件夹,一个是sdk,一个是demo,公交线路查询模块就参考了一下demo,sdk文件夹下的apidoc里面的api说明文档是我们要经常看的。sdk文件夹下的lib文件夹下有个aibang-android-open-sdk-1.0.0.jar 包,我们等会新建项目时要把这个jar包导进去的,另外还要去下载httpmime-4.2.1.jar这个jar包。

(4)新建一个项目,我将其命名为MyAiBang1.0,如下图所示:

(5)建议大家先导入项目运行起来,玩下就明白了,现在也先演示下:

        运行软件起来,并输入要查询的路线如下:

    

     点击查询,便查出与25号线相关的公交路线(数据解析后填充在一个ListView控件里):

  

    再点击其中一条路线,如点击b25路,便跳转到另一个Activity,如下:

  

(6)看看返回的数据,像result_num、web_url等我是用不到的,我能用到的只有name、info、stats三个字段,所以我在com.myaibang.domain包下新建一个Line类,如下:

public class Line {
private String name;
private String info;
private String stats;
public Line(String name, String info, String stats) {
this.name = name;
this.info = info;
this.stats = stats;
}
public Line() {
}
//省略getter和setter方法
}

(7)新建一个Activity,我将其命名为RouteActivity,对应下面两个页面:

     


请对应代码听我讲解,哈。

在RouteActivity里建一个内部类AibangAsyncTask,如下:

private class AibangAsyncTask extends AsyncTask

这个主要参考下载的sdk里的demo,关于AsyncTask,大家可以网上找下相关资料看看,因为这节主要是讲json的解析,所以略过。

private static final String API_KEY=”766cb8dbbdb7fba92de17f0b2d88745b”;  API_KEY,大家懂的,用刚刚申请的。

mAibang=new AibangApi(API_KEY);  初始化,默认是返回json格式的数据。

routeData=editText.getText().toString();  这个是获取输入框里输入的路线的数据。

result=mAibang.busLines(“广州”, routeData, 0);  这里我是写死城市是广州的,result就是返回的数据,是json格式的。

JSONObject jsonObject=new JSONObject(result);

String lines=jsonObject.getString(“lines”);

JSONObject jsonObject2=new JSONObject(lines);

String line=jsonObject2.getString(“line”);

JSONArray jsonArray=new JSONArray(line);  通过LogCat可以查看到line返回的是数组,所以我将其初始化为一个json数组

List data = new ArrayList();

List list=new ArrayList();

for(int i=0;i

jsonObject2=jsonArray.getJSONObject(i);
String name=jsonObject2.getString(“name”);
String info=jsonObject2.getString(“info”);
String stats=jsonObject2.getString(“stats”);

list.add(new Line(name,info,stats));

data.add(name);

}   通过遍历,解析json格式的数据,data的数据添加到当前的ListView里面。

listView.setAdapter(new ArrayAdapter(RouteActivity.this, android.R.layout.simple_expandable_list_item_1,data)); 这句不用解释了吧,呵!就是将数据添加到ListView显示出来。

//intent将数据传到RouteResultActivity
Intent intent=new Intent(RouteActivity.this,RouteResultActivity.class);
intent.putExtra(“resultData”, list.get(arg2).getStats()); 我要的是各个站点的数据。
startActivity(intent);
overridePendingTransition(R.anim.push_left_in,R.anim.push_left_out);一个过渡的动画,不错的例子来的,可以参考用到其他项目中去。

(8)新建名为RouteResultActivity的类,显示线路的各个站点

Intent intent=getIntent();
String value=intent.getStringExtra(“resultData”);  获取RouteActivity传过来的值。

点击B25,通过LogCat查看返回的值如下:

体育中心;石牌桥(BRT);岗顶(BRT);师大暨大(BRT);华景新城(BRT);上社(BRT);学院(BRT);科韵路;琶洲大桥北;北山;星海学院[大学城];华师[大学城];广大[大学城];广大生活区[大学城];广大公寓[大学城];大学城总站[中部枢纽]

List data = new ArrayList();  将解析的以上的数据一个个添加到data里。

解析的思想:主要是通过“;”,如下:

int j=0;

for(int i=0;i

if(value.charAt(i)==’;'){
infoData=value.substring(j,i);
Log.v(TAG, “返回的infoData值为”+infoData);
j=i+1;
data.add(infoData);
}

if(i==value.length()-1){
infoData=value.substring(j,i+1);
Log.v(TAG, “返回的infoData值为”+infoData);
data.add(infoData);
}

}

listView2.setAdapter(new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1,data)); 显示出来了。

(9)json格式的数据解析其实很简单,关键要看好那个格式是如何组成的,有没有数组。有一个网站,格式化json格式挺不错的,介绍一下:http://jsonformatter.curiousconcept.com/

(10)除了解析json数据这块之外,本项目的首页淡入淡出的效果、两个Activity之间的跳转动画、底部tabhost导航菜单,这些在实战应用中也是常用到的,需要的话可以参考一下,对本文有疑问的可以找我。我的邮箱是[email protected]该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。,大家一起共同探讨吧!哈。

项目源码:http://pan.baidu.com/share/link?shareid=302862&uk=1796216265

你可能感兴趣的:(Android)