准备尝试试着做一个天气应用,由于返回的数据是JSON格式的,找了些资料,看了别人写的一些关于JSON的,但是都是针对简单的JSON串。自己弄了一天多才明白,所以把自己的经验分享出来(第一次写东西见谅)。
首先就是jar包 这里我有一个地址http://cn.jarfire.org/这里的挺全的 我的Eclipse导入的是 json1.5的包。Android本身就有json的支持所以不用导包。
先看一下我要解析的资源,这里我只是用了一部分。
{
"msg": "success",
"result": [
{
"city": [
{
"city": "合肥",
"district": [
{
"district": "合肥"
},
{
"district": "长丰"
}
]
},
{
"city": "蚌埠",
"district": [
{
"district": "蚌埠"
},
{
"district": "怀远"
}
]
},
{
"city": "芜湖",
"district": [
{
"district": "芜湖"
},
{
"district": "繁昌"
}
]
}
],
"province": "安徽"
},
{
"city": [
{
"city": "北京",
"district": [
{
"district": "北京"
},
{
"district": "平谷"
},
{
"district": "门头沟"
}
]
}
],
"province": "北京"
},
{
"city": [
{
"city": "重庆",
"district": [
{
"district": "重庆"
},
{
"district": "秀山"
}
]
}
],
"province": "重庆"
}
],
"retCode": "200"
}
这些是服务器传回的一部分,之后我把它转义成了字符串。
下面的是返回数据说明
- 名称 类型 说明
retCode int 返回码
msg string 返回说明
result string 返回结果集
province string 省份
city array 城市
district array 区县
先来看一下这个返回一个集合,集合包含msg、result、retCode其中result数组包含了三个对象,每个对象里又都有一个city数组,数组里又有数组好吧是挺麻烦的。
这里给一个我用到的json在线解析的网站 。json解析的有好多我 这只是我用到的http://www.bejson.com/jsonviewernew/# 转义之后是这样
{\"msg\":\"success\",\"result\":[{\"city\":[{\"city\":\"合肥\",\"district\":[{\"district\":\"合肥\"},{\"district\":\"长丰\"}]},{\"city\":\"蚌埠\",\"district\":[{\"district\":\"蚌埠\"}]}],\"province\":\"安徽\"},{\"city\":[{\"city\":\"北京\",\"district\":[]}],\"province\":\"北京\"}],\"retCode\":\"200\"}
上面的这些我直接把定义成一个String mJsonString 因为服务器返回的JSON也是作为一个String类型参数传入解析的
之后是解析的方法
private static void parseJson(String json){
try {//这里因为解析json会有异常所以要用try catch包裹
//首先需要一个JSONObject对象
JSONObject mJsonObject = new JSONObject(json);
//之后通过get方法拿到资源 直接传入要拿到资源的字符串
String msg = mJsonObject.getString("msg");
System.out.println(msg);//输出到控制台看一下拿到的资源
int retCode = mJsonObject.getInt("retCode");
System.out.println(retCode);
if (msg.equals("success")&&retCode==200) {//判断数据是否成功拿到
//成功拿到数据之后 再创建一个JSONArray数组
JSONArray mResultArray = mJsonObject.getJSONArray("result");
//之后通过for循环来拿到数据 这是第一层
for (int i = 0; i < mResultArray.length(); i++) {
JSONObject mCityObj = mResultArray.getJSONObject(i);
String mProvince = mCityObj.getString("province");
System.out.println("Province:"+mProvince);
JSONArray mCityArray = mCityObj.getJSONArray("city");
//第二层
for (int j = 0; j < mCityArray.length(); j++) {
JSONObject mDistrict = mCityArray.getJSONObject(j);
String mCity = mDistrict.getString("city");
System.out.println(" City:"+mCity);
JSONArray mDistrictArray = mDistrict.getJSONArray("district");
//第三层
for (int k = 0; k < mDistrictArray.length(); k++) {
JSONObject districtobj = mDistrictArray.getJSONObject(k);
String district = districtobj.getString("district");
System.out.println(" district:"+district);
}
}
}
}
} catch (JSONException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
其实就是通过循环遍历数组对象,数组里还有就再次循环遍历,里边的元素用get+数据类型(“映射键”)来拿到
传入mJsonString 运行看一下控制台
public static void main(String[] args) {
parseJson(mJsonString);
}
success
200
Province:安徽
City:合肥
district:合肥
district:长丰
City:蚌埠
district:蚌埠
district:怀远
City:芜湖
district:芜湖
district:繁昌
Province:北京
City:北京
district:北京
district:平谷
district:门头沟
Province:重庆
City:重庆
district:重庆
district:秀山
到这里所有的数据已经全部成功拿到 至于怎么用就看你了