2016-07-07 57 views
0

我已启用Proguard并为我正在使用的所有库添加适当的proguard规则。应用Proguard后,杰克逊跳过解析JSON响应与根

我使用Retrofit进行网络调用和Jackson转换器来解析响应。

我的Json响应具有根值,用Jackson解析此设置我使用设置SerializationFeature.WRAP_ROOT_VALUEDeserializationFeature.UNWRAP_ROOT_VALUE。一切工作,直到我申请proguard。

没有给出任何解析异常,这些字段被解析为空值。

我使用了杰克逊的Proguard的规则是

-keepnames class com.fasterxml.jackson.** { *; } 

-dontwarn com.fasterxml.jackson.databind.* 

-keepattributes *Annotation*,EnclosingMethod,Signature 

-keep class org.codehaus.** { *; } 

-keepclassmembers public final enum 
org.codehaus.jackson.annotate.JsonAutoDetect$Visibility { 
    public static final org.codehaus.jackson.annotate.JsonAutoDetect$Visibility *; 
} 

-keepclasseswithmembers class com.jombay.vger.rx.resources.** { 
    public protected private <init>(...); 
    public void set(*); 
    public ** get*(); 
} 

-keepclasseswithmembers public class com.jombay.vger.retrofit.resources.** { 
    public protected private <init>(...); 
    public void set(*); 
    public ** get*(); 
} 

-keepclasseswithmembers public class com.jombay.vger.utils.** { 
    public protected private <init>(...); 
} 

-keepclassmembers class * { 
@org.codehaus.jackson.annotate.* *; 
} 

-keep class com.fasterxml.jackson.databind.ObjectMapper {*;} 

-keep class com.fasterxml.jackson.databind.ObjectWriter {*;} 

我想出了解决很多其他问题后,此配置。

无法在此处进行调试和理解问题。

回答

0

在您的配置中,为了保持您的域类,您缺少一些通配符。取而代之的是

-keepclasseswithmembers class com.jombay.vger.rx.resources.** { 
    public protected private <init>(...); 
    public void set(*); 
    public ** get*(); 
} 

它应该是:

-keepclasseswithmembers class com.jombay.vger.rx.resources.** { 
    <init>(...); 
    public void set*(***); 
    public *** get*(); 
} 
+0

@ T-neidhart:非常感谢它的工作就像一个魅力 –