Json格式数据和xml数据是软件开发中常见的数据存储类型,它们在前后端交数据的交互上提供了便捷的方式,既可以将对象转换成json也可以将文件,数组,集合转换为json,通过流的方式发送给客户端。
Json解析分为Gson解析和android的自带的解析API,这篇文章我们讨论Android的自带的Json解析方式的用法。
Json数据准备
这里我在网络上找到了一个天气预报的接口,提供的是json数据,网址:http://wthrcdn.etouch.cn/weather_mini?citykey=101010100,这里的citykey=101010100,为北京市,这里我只是做JSon解析,就不探讨其他城市的key值了,这里我们打开网站会看到显示如下:
乱码!!!什么也看不懂。
但是,我们可以看出它是属于一个json数据格式的,这就需要我们将获取的数据进行编码转换,转换成UTF-8编码就可以了。
Json数据的处理
这里贴出我写的一些代码,把网络请求放到一个独立的线程中去完成。
thread = new Thread(){
public void run(){
try {
//初始化URl
URL url = new URL("http://wthrcdn.etouch.cn/weather_mini?citykey=101010100");
//打开链接
URLConnection connection = url.openConnection();
//读入流数据
InputStream is = connection.getInputStream();
//设置缓冲
BufferedInputStream bis = new BufferedInputStream(is);
//设置输出流
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buff = new byte[512];
int read = 0;
while((read = bis.read(buff)) != -1){
outStream.write(buff,0,read);
}
byte[] data = outStream.toByteArray();//网页的二进制数据
outStream.flush();
outStream.close();
bis.close();
is.close();
str = new String(data,"utf-8");//格式转换
Message message = new Message();
message.what =0x001;
hander.sendMessage(message);
} catch (MalformedURLException e) {
Message message = new Message();
message.what =0x002;
hander.sendMessage(message);
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
};
};
thread.start();
这样我们就可以获得正确的json数据了,我们可以将获得str字符串打印出来。效果是这样的:
然后我们将这些数据复制出来,将他们手动格式化一下,分析其json格式:
图片没能贴全。但大部分都贴出来了,基本的格式我们也可以看出来,这组Json数据,{}中的为JsonObject,[]中的JsonArray,我们经过这种格式化的分析时就可以很方便的将json数据解析出来了。
我们发现[]中的内容是很一致的,于是我定义了一个类对象,方便我们的数据使用。
public class Wether {
/*
"fengxiang":"北风",
"fengli":"5-6级",
"high":"高温 24℃",
"type":"晴",
"low":"低温 11℃",
"date":"3日星期六"
*/
private String fengxiang;
private String fengli;
private String high;
private String type;
private String low;
private String date;
private String city;
public Wether() {
}
public Wether(String fengxiang, String fengli, String high, String type, String low, String date, String city) {
super();
this.fengxiang = fengxiang;
this.fengli = fengli;
this.high = high;
this.type = type;
this.low = low;
this.date = date;
this.city = city;
}
//省略了get和set方法!!!!
}
Json数据的解析
我准备了一个JsonTool的类,在里面写了两个处理数据的方法:
我们将{}中的数据用JsonObject进行解析:
JSONObject rootObject = new JSONObject(str);
JSONObject object = (JSONObject) rootObject.get("data");
然后我们就可以获得data里面的json数据了,由于data里面的forecast是一组数组形式的数据我们用JsonArray进行解析转换成数组;
JSONArray array = (JSONArray) object.get("forecast");
然后我们利用循环将数据解析并进行存储这里用了Arraylist集合对象
String city = object.getString("city");
for (int i = 0; i < array.length(); ++i) {
/*
"fengxiang":"北风",
"fengli":"5-6级",
"high":"高温 24℃",
"type":"晴",
"low":"低温 11℃",
"date":"3日星期六"
*/
JSONObject o = (JSONObject) array.get(i);
o.getString("high"),
o.getString("type"),
o.getString("low"),
o.getString("date"),
city));}
data里面还有一个yesterday的json对象,我们将他单独解析出来,放到list后面。
JSONObject yDayObject = (JSONObject) object.get("yesterday");
wethers.add(new Wether(yDayObject.getString("fx"), yDayObject.getString("fl"), yDayObject.getString("high"),
yDayObject.getString("type"),
yDayObject.getString("low"),
yDayObject.getString("date"),
city)
);
这样我们的json数据就解析成功了。
另外我有定义了一个类将其他的一些额外信息进行解析;
public String[] dealAnotherJson(String str){
String[] strs = new String[4];
try {
JSONObject rootObject = new JSONObject(str);
JSONObject object = (JSONObject) rootObject.get("data");
strs[0] = object.getString("wendu");
strs[1] = object.getString("ganmao");
strs[2] = object.getString("aqi");
strs[3] = object.getString("city");
} catch (JSONException e) {
e.printStackTrace();
System.out.println("初始化解析JSON失败");
}
return strs;
}
这样整个数据都解析完成了。
下面就让我们看看在手机上显示的如何吧:
当然你也可以找到自己城市的key,设置自己城市的天气情况,并美化UI界面。
总结:
- 先分析得到的json数据,将其格式化后在确定解析的方法
- 在{}中的均为Json对象,直接用JsonObject进行解析,在[]中的为json数组,就用JsonArray进行转换成数组。
- 尽量找出共同点,建立类对象进行存储数据,和数据的迁移。
- 只要我们调理清楚,再麻烦的json数据也是可以经过一步一步的拆分而解决的。