gson容易混淆的几处

来源:互联网 发布:淘宝代码装修视频 编辑:程序博客网 时间:2024/05/16 04:24


使用gson,后台如果返回类似:data:[]  

伪代码: A为一个类

 private List<A> parseResultInfo(String jsonString) {
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<A>>() {
        }.getType();
        return gson.<ArrayList<A>>fromJson(jsonString, type);
    }


后台返回类似:data:{}

伪代码:A为一个类

 public A  parseHospitalDepartment(String datas){
        Gson gson = new Gson();
        return gson.fromJson(datas,A.class);
    }


弄错就会提示:Could not find method com.google.gson.reflect.TypeToken.<init>



还有个容易出错的点:我在一个类A里面定义了一个内部类B,正常情况下是:由于gson使用映射的方法找到B.class中对应的成员变量名称,将json格式的的字段对应的值赋值给B类中对应的成员变量。
但是由于经过proguard混淆后 B类的内部的成员变量名称发生了变化。已经无法找到json字段中对应的类成员变量。所以导致所有生成的B类成员变量值都为null 。


所以解决办法有两个:

   1是:声明内部类不混淆

             在proguard-rules.pro中加入下面规则。 对B.Java的所有private 对象不进行obfuscation。

如果是内部类可以使用下面声明::

        -keep class com.project.mocha_patient.login.FindForgotInfoActivity$ForgetResponse {*;}  
        -keep class com.project.mocha_patient.account_setting.ChangePasswordActivity$ChangePasswordResponse {*;}  

如果不是内部类:
-keep public class com.google.gson.**  
-keep public class com.google.gson.** {public private protected *;}   
-keep public class com.project.mocha_patient.login.A{ private *; }  

  

  2是:在内部类B中,将所有被gson使用的变量都加下面声明,这样gson就可以识别对应的变量。

    

@SerializedName("name")

   //下面是内部类

     static class B{
       @SerializedName("bsOrderNo")
       String bsOrderNo;//订单号
       @SerializedName("bsState")
       String bsState;//充值结果
       @SerializedName("bsLastTime")
       String bsLastTime; //日期
       @SerializedName("bsAmount")
       String bsAmount; //金额
   }



  

0 0
原创粉丝点击