2014-04-02 77 views
0

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

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),但问题仍然存在。

+1

http://stackoverflow.com/questions/6533676/proguard-and-gson-on-android-classcastexception?rq=1顶部的答案可能会有所帮助 –

+0

谢谢你的回答。我的proguard文件类似于https://code.google.com/p/google-gson/source/browse/trunk/examples/android-proguard-example/proguard.cfg的“Gson的proguard配置” – johann

回答

5

你想保持类的,你是序列化等领域,与原来的名称:

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

ProGuard的可能,否则重命名或甚至将其删除。

+0

谢谢埃里克为你提供帮助(在几个月内第二次),也为这个真棒工具!欢呼声 – johann

+0

我在使用proguard时遇到了很多与Gson有关的问题,我如何让gson从 –