应用Proguard之后,杰克逊跳过用根解析json响应

时间:2016-07-07 10:01:24

标签: android json jackson proguard android-proguard

我启用了Proguard并为我正在使用的所有库添加了正确的proguard规则。

我使用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 {*;}

在解决了很多其他问题之后,我已经提出了这个配置。

此处无法调试和了解此问题。

1 个答案:

答案 0 :(得分:0)

在保留域类的配置中,您缺少一些通配符。而不是这个

func bridge<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer(Unmanaged.passUnretained(obj).toOpaque())
}


func bridge<T : AnyObject>(ptr : UnsafePointer<Void>) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
}

func bridgeRetained<T : AnyObject>(obj : T) -> UnsafePointer<Void> {
return UnsafePointer( Unmanaged.passRetained(obj).toOpaque())}

func bridgeTransfer<T : AnyObject>(ptr : UnsafePointer<Void>) -> T {
return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()}

应该是:

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