今天在解析json时,遇到解析错误的问题。
总结来说,字段必须要一致,字段类型要一致,序列化,还要在混淆的情况下要保持相应的类不被混淆。
要保持bean 不被混淆,在 proguard-rules.pro添加如下代码:
-keep class 包名.** { *; }
如下面这个路径下的UserInfo
com.baidu.app.improve.bean.UserInfo
对应的混淆文件配置:
-keep class com.baidu.app.improve.bean.** { *; }
若在混淆情况下不做如此设置则会报诸如“com.a.b.b.h cannot be cast to com.baidu.app.improve.bean.UserInfo ”这样的异常。
当然解析方式不正确的话,也会报此异常。
这样一个json数据:
{
"code": 0,
"message": "",
"result": {
"id": "081234568945",
"sn": "",
"nickname": "abcd",
"mobile": "18888888",
"email": "",
"avatar": "",
"birth": "",
"gender": "1",
"name": "",
"longitude": "",
"latitude": "",
"availablePoint": 0,
"receivePoint": 0,
"makePoint": 0,
"age": 0,
"genderDescription": "男",
"residenceId": "",
"residenceParentIds": "",
"residenceName": "",
"residenceMergerName": "",
"memberTypeName": "个人"
}
}
写的bean如下:
ResultBean
public class ResultBean<T> {
private T result;
private int code;
private String message;
.....get/setter方法
}
UserInfo
public class UserInfo implements Serializable{
private String genderDescription;
private int receivePoint;
private String gender;
private String residenceParentIds;
private int makePoint;
private String latitude;
private String mobile;
private String birth;
private String avatar;
private String residenceId;
private String residenceMergerName;
private String memberTypeName;
private String nickname;
private String name;
private int availablePoint;
private String id;
private String sn;
private String email;
private int age;
private String longitude;
private String residenceName;
......get/setter方法......
}
gson解析的正确姿势为:
private static TextHttpResponseHandler mHandler = new TextHttpResponseHandler() {
@Override
public void onStart() {
super.onStart();
log("HttpResponseHandler:onStart");
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
log("HttpResponseHandler:onFailure responseString:" + responseString);
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Type type = new TypeToken<ResultBean<UserInfo>>() { }.getType();
ResultBean<UserInfo> resultBean = AppOperator.createGson().fromJson(responseString, type);
...............
}
gson解析集合
json
{
"code": 0,
"message": "",
"result": {
"currentCount": 3,
"dataList": [
{
"id": "6",
"longitude": 116.42565,
"latitude": 39.84026,
"isRead": true,
"isCollection": true,
"deadline": "2017-02-24 17:34",
"memberType": "个人",
"pupuContent": "",
"publishDate": "2017-02-23 17:34",
"intervalTime": "5天",
"publisher": "",
"publisherAvatar": "",
"recipientName": "",
"recipientAvatar": "",
"distance": 0
},
{
"id": "5",
"longitude": 116.42565,
"latitude": 39.84026,
"isRead": true,
"isCollection": true,
"deadline": "2017-02-24 17:34",
"memberType": "个人",
"pupuContent": "",
"publishDate": "2017-02-23 17:34",
"intervalTime": "5天",
"publisher": "",
"publisherAvatar": "",
"recipientName": "",
"recipientAvatar": "",
"distance": 0
},
{
"id": "2",
"longitude": 116.42565,
"latitude": 39.84026,
"isRead": false,
"isCollection": false,
"deadline": "2017-02-24 17:34",
"memberType": "个人",
"pupuContent": "",
"publishDate": "2017-02-23 17:34",
"intervalTime": "5天",
"publisher": "",
"publisherAvatar": "",
"recipientName": "",
"recipientAvatar": "",
"distance": 0
}
],
"pageNo": 1,
"pageSize": 100,
"isLastPage": true,
"lastCount": 1,
"count": 3
}
}
public class PageBean<T> implements Serializable {
private int currentCount;
private List<T> dataList;
.........get/setter方法.......
}
Tweet
public class PPMessage implements Serializable {
private String id;
private int distance;
private String recipientAvatar;
private double latitude;
private String pupuContent;
private boolean isRead;
private boolean isCollection;
private String publishDate;
private int min;
private String publisherAvatar;
private String publisher;
private String recipientName;
private String memberType;
private String deadline;
private double longitude;
.......get/setter方法......
}
解析
TextHttpResponseHandler mHandler = new TextHttpResponseHandler() {
@Override
public void onStart() {
super.onStart();
log("HttpResponseHandler:onStart");
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
onRequestError();
log("HttpResponseHandler:onFailure responseString:" + responseString);
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
log("HttpResponseHandler:onSuccess responseString:" + responseString);
try {
ResultBean<PageBean<T>> resultBean = AppOperator.createGson().fromJson(responseString, getType());
................
}
....................
这里用了泛型。