【问题标题】:Gson library and ProguardGson 库和 Proguard
【发布时间】:2014-04-02 05:32:35
【问题描述】:

我遇到了关于 proguard 和 Gson 库的问题。我的代码是

AdServerResult result = (AdServerResult) new Gson().fromJson(json, 
      AdServerResult.class);

(我使用 Gson 库创建了一个新的 AdServerResult 对象)

我的AdServerResult 班级:

public class AdServerResult {

    public ArrayList<AdServerObject> shorts ;
    public ArrayList<AdServerObject> longs ;

    public ArrayList<AdServerObject> getShorts() {
        return shorts;
    }
    public void setShorts(ArrayList<AdServerObject> shorts) {
        this.shorts = shorts;
    }
    public ArrayList<AdServerObject> getLongs() {
        return longs;
    }
    public void setLongs(ArrayList<AdServerObject> longs) {
        this.longs = longs;
    }

    //for debug
    @Override
    public String toString(){

        StringBuilder sb = new StringBuilder() ;

        if (shorts!=null && shorts.size()>0){
            for (AdServerObject s: shorts){
                sb.append("url: "+s.getPicture_url());
            }
        }

        if (longs!=null && longs.size()>0){
            for (AdServerObject s: longs){
                sb.append("url: "+s.getPicture_url());
            }
        }

        return sb.toString();
    }

}

我的AdServerObject(出现在AdServerResult 类中):

public class AdServerObject{

    public String appli_id;
    public String picture_url;

    public String getAppli_id() {
        return appli_id;
    }
    public void setAppli_id(String appli_id) {
        this.appli_id = appli_id;
    }
    public String getPicture_url() {
        return picture_url;
    }
    public void setPicture_url(String picture_url) {
        this.picture_url = picture_url;
    }       
}

我的“json”字符串如下:

{ 
  "shorts": [
    { "appli_id": "282", "picture_url": "xxxx"},
    { "appli_id": "275", "picture_url": "xxx" }
  ], 
  "longs": [
    {"appli_id": "MyAppli3", "picture_url": "xxxxx"},
    {"appli_id": "MyAppli4", "picture_url": "xxxxx" }
  ]

}

此代码有效,但使用 proguard 导出时,AdServerResult 实例为 null

我的 proguard 文件(只有 json 部分):

# for gson (GSON @Expose annotation)
-keep public class com.google.gson.Gson
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }

...

-keepattributes Signature
-keepattributes *Annotation*

...

-keep public class jp.xxx.ad_server.AdServerResult
-keep public class jp.xxx.ad_server.AdServerObject
-keepclassmembers class jp.xxx.ad_server.AdServerObject
-keepclassmembers class jp.xxx.ad_server.AdServerResult

我已经多次使用这个Gson().fromJson,但我从来没有遇到过这样的问题......我在这个问题上苦苦挣扎了 12 个小时,我的大脑快要爆炸了。

-- 编辑

我已经更新了 proguard(4.11),但问题仍然存在。

【问题讨论】:

标签: android json gson proguard


【解决方案1】:

您希望保留正在序列化的类的字段及其原始名称:

-keepclassmembers class jp.xxx.ad_server.AdServerResult$AdServerObject { <fields>; }
-keepclassmembers class jp.xxx.ad_server.AdServerResult { <fields>; }

ProGuard 可能会以其他方式重命名甚至删除它们。

【讨论】:

  • 感谢 Eric 的帮助(几个月内第二次)以及这个很棒的工具!干杯
  • 我在使用 proguard 时遇到了很多关于 Gson 的问题,我该如何阻止 gson 进入
猜你喜欢
  • 2015-03-31
  • 2011-09-25
  • 2016-12-02
  • 2016-02-11
  • 1970-01-01
  • 2014-07-12
  • 2013-10-07
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多