gson解析注意事项

今天在解析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());
                ................
}

....................

这里用了泛型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值