目前,服务器数据请求大多以json格式返回,android2.3提供的json解析类 JSONObject。但是这个需要自己封装一个json解析类。同时目前主流框架选择:
google的Gson 和阿里巴巴的FastJson。
compile 'com.alibaba:fastjson:1.2.22'
下载地址http://repo1.maven.org/maven2/com/alibaba/fastjson/1.2.14/
FastJson常用的序列化操作都可以在JSON类上的静态方法直接完成。
public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
示例
json数据1 - data: {"status":1,"data":"","messages":"验证成功"}
JSONObject jsonObject = JSONObject.parseObject(data);
String message = jsonObject.getString("messages");
**json数据2 - data:**
{
"now": {
"englishName": "Sunny/Clear",
"imgUrl": "http://10.60.62.118:8090/parkinglot//images/cond_icon/100.png",
"fl": "36",
"name": "晴",
"code": 100
},
"aqi": {
"pm10": "72",
"pm25": "43",
"qlty": "轻度污染"
},
"vehicle_restriction": {}
}
**新建Bean对象**
public class WeatherBean {
private Aqi aqi;
private Now now;
private Vehicle vehicle_restriction;
public Aqi getAqi() {
return aqi;
}
public void setAqi(Aqi aqi) {
this.aqi = aqi;
}
public Now getNow() {
return now;
}
public void setNow(Now now) {
this.now = now;
}
public Vehicle getVehicle_restriction() {
return vehicle_restriction;
}
public void setVehicle_restriction(Vehicle vehicle_restriction) {
this.vehicle_restriction = vehicle_restriction;
}
public class Aqi{
public String pm10;
public String pm25;
public String qlty;
}
public class Now{
public String code;
public String name;
public String englishName;
public String imgUrl;
public String fl;
}
public class Vehicle{
public String number;
public String area;
}
}
**数据转换**
WeatherBean weath = JSONObject.parseObject(resultData,WeatherBean.class);
其他的就不一一说明,需要的自己尝试或度娘。
注:经验得出:fastjson的key不区分大小的。
例如:private Aqi aqi;写成private Aqi AQI;也可以解析出来
错误及解决
错误1:JSONObject parseObject解析错误
com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 0
原因:
1:http请求方式错误。Get请求写成了Post请求。
2:bean里内嵌了一个bean变量。,转换有时会有问题。
3:返回是List,调用错误。
解决:
JSONObject parseObject 改 JSONObject.parseArray(个人尝试)
Gson由谷歌研发,可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
compile 'com.google.code.gson:gson:2.4'
下载,http://search.maven.org/#search%7Cga%7C1%7Ccom.google.code.gson
toJson()方法
用于将Java对象转换为相应的JSON数据,主要有以下几种形式:
fromJson()方法
用于将JSON数据转换为相应的Java对象,主要有以下几种形式:
以上的方法用于将不同形式的JSON数据解析成Java对象。
注意:如果你的Json里面不止一个对象,那么你就得使用一个集合来装,我们这里模拟一个list来装的例子,在使用list装的过程中我们会使用到一个工具类,typeToken,通过它我们可以获取一个泛型的数据类型,使用方法十分简单,TypeToken(泛型)(){}.gettype()即可,返回一个type类型,这就是fromjson所需要的type类型,
**json数据**
String s="[{name:'zhangsan',age:12},{name:'lisi',age:12}]";
**bean对象**
public class user {
private String name;
private int age;
.....
}
**json转换**
new Gson().fromJson(jsonString, new TypeToken>(){}.getType());