您的位置:首页 > Web前端 > JavaScript

Json的几种解析方法

2015-01-21 15:28 134 查看
Json数据是比较常见的网络传输数据格式,相比较xml,它更加轻量级,也就更加的节省流量,解析起来也比xml要简单一点,目前Android中有几种方法来解析Json数据。一种是直接用JSONObject对象和JSONArray数组来解析,这种一般对于数据结构比较简单的比较方便,还有一种就是利用谷歌提供的Gson来进行解析,对于数据复杂的JSON相当简便,下面来具体介绍一下这两种方法。首先用来看看JSONObject。

{
"resultcode":"200",
"reason":"成功的返回",
"result":{
"area":"浙江省温州市平阳县",
"sex":"男",
"birthday":"1989年03月08日"
}
}

上面这段json是非常基础非常简单的一段,可以直接利用JSONObject来解析。

JSONObject o1 = new JSONObject(res);

res是传过来的json数组流,o1解析到了就是里面的数据键值对,而result中又嵌套了一层键值对,我们需要的就是result中的值,也非常简单

JSONObject result = o1.getJSONObject("result");

直接利用getJSONObject方法来获得result中的值就行了,然后在将里面具体的值赋给我们的变量即可

String area = result.getString("area")

直接利用getString()方法,同理还有getInt(),getBoolean()等方法。

JSONArray一般是解析数组的,简单的说就是解析【】里面的数据,比如下面一段中result的值,就是以数组形式存在的。

{
"resultcode": "200",
"reason": "SUCCESSED!",
"result": [
{
"city": "苏州",  /*城市*/
"PM2.5": "73",  /*PM2.5指数*/
"AQI": "98",    /*空气质量指数*/
"quality": "良", /*空气质量*/
"PM10": "50",/*PM10*/
"CO": "0.79",  /*一氧化碳*/
"NO2": "65",  /*二氧化氮*/
"O3": "28",    /*臭氧*/
"SO2": "41",  /*二氧化硫*/
"time": "2014-12-26 11:48:40"/*更新时间*/
}
],
"error_code": 0
}

要想解析这种格式的数据,直接一层一层剥开解析也不是很困难,主要是因为虽然这里面有嵌套,但是结构不复杂也很清晰。

JSONObject o1 = new JSONObject(result);


一开始同样是JSONObject的对象,因为最外层是{ },所以用这个,下一步

JSONArray res = o1.getJSONArray("result");

result是一个数组了,所以要用JSONArray来解析,一个【】就是一组数,所以其实result里只有一组数,得到里面的数据也很容易

JSONObject o2 = res.getJSONObject(0);

如果数据位数较多,就要用循环取出来了。这里就已经得到了result中的值了,下面直接赋值即可。

这些就是JSONObject与JSONArray的基本解析方法了,一层一层的剥开,{ }用JSONObject,【】用JSONArray,记住这些就行了。

其实还有一种方法就是利用谷歌提供的gson来解析,gson在面对结构复杂,数据庞大的json时很有优势。还是以上面的json来做例子。

要使用gson首先要是需要jar包的,下载地址http://download.csdn.net/detail/u011780646/8383517

首先要定义一个实体类来存取数据,JsonBean

package utils;

import java.util.ArrayList;
import java.util.List;

public class JsonBean {

private String resultcode;
private String reason;
private List<Result> result;
private String error_code;

public String getResultcode(){
return resultcode;
}

public void setResultcode(String resultcode){
this.resultcode = resultcode;
}

public String getReason(){
return reason;
}

public void setReason(String reason){
this.reason = reason;
}

public List<Result> getReslt(){
return result;
}

public void setResult(List<Result> results){
this.result = result;
}

public String getErrorCode(){
return error_code;
}

public void setErrorCode(String error_code){
this.error_code = error_code;
}

}

可以看到数组类型的定义成了List类型,泛型是Result,那么还应该有一个Result的类。

package utils;

public class Result {
private String city;
private String AQI;
private String quality;
private String time;

public String getCity(){
return city;
}

public void setCity(String city){
this.city = city;
}

public String getAQI(){
return AQI;
}

public void setAQI(String AQI){
this.AQI = AQI;
}

public String getQuality(){
return quality;
}

public void setQuality(String quality){
this.quality = quality;
}

public String getTime(){
return time;
}

public void setTime(String time){
this.time = time;
}

}

这里就定义了result中各种数值,{ }里的键值对是String,int,boolean等类型,【】是List的类型,其实也是一层一层的剥开,不过这种逻辑上要更直观一点。数据类建好了,就开始解析了,gson解析起来非常的简单。

Gson gson = new Gson();

首先实例化一个gson对象

JsonBean jsonbean = gson.fromJson(result, JsonBean.class);


利用fromJson的方法获得数据,这里传入了两个参数,第一个就是你的json数据源了,第二是刚才建立好的数据类,也就是最外面的那层。

List<Result> listresult = jsonbean.getReslt();

我们需要的list的数据,直接调用get()方法就可以得到了,这样就得到了一个List<Result>对象,用for循环取出即可

for(Result r: listresult){
String city = r.getCity();
String aqi = r.getAQI();
String quality = r.getQuality();
String time = r.getTime();
}

这样就可以将json数据完整的解析出来了。

附上一篇关于JSONObject与JSONArray的文章,讲的很透彻/article/1597921.html

篇外:刚刚正式接触Android不久,以前也零散的学习过一点,一直都是略懂皮毛,现在也是安下心来从事Android方面的工作了,才发现连皮毛都不懂。也是在一点一点的学习之中,写这些一是为了加强一下记忆,在总结的过程中回味整个代码的过程,二也是做一个记录,免得很久不用又遗忘了,也希望有不对的地方能够指出来,大家多交流交流!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: