应用 Proguard 后,Jackson 跳过解析 json 响应与 root
After applying Proguard, Jackson skipping to parse json response with root
我启用了混淆器并为我正在使用的所有库添加了适当的混淆器规则。
我使用 Retrofit 进行网络调用,使用 Jackson 转换器来解析响应。
我的 Json 响应有根值,为了使用 Jackson 解析它,我使用设置 SerializationFeature.WRAP_ROOT_VALUE
和 DeserializationFeature.UNWRAP_ROOT_VALUE
。在我应用混淆器之前一切正常。
在不给出任何解析异常的情况下,字段被解析为空值。
我为 Jackson 使用的 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 {*;}
我在解决了很多其他问题后想出了这个配置。
无法调试和理解这里的问题。
在您保留域的配置中 类,您缺少一些通配符。而不是这个
-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*();
}
我启用了混淆器并为我正在使用的所有库添加了适当的混淆器规则。
我使用 Retrofit 进行网络调用,使用 Jackson 转换器来解析响应。
我的 Json 响应有根值,为了使用 Jackson 解析它,我使用设置 SerializationFeature.WRAP_ROOT_VALUE
和 DeserializationFeature.UNWRAP_ROOT_VALUE
。在我应用混淆器之前一切正常。
在不给出任何解析异常的情况下,字段被解析为空值。
我为 Jackson 使用的 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 {*;}
我在解决了很多其他问题后想出了这个配置。
无法调试和理解这里的问题。
在您保留域的配置中 类,您缺少一些通配符。而不是这个
-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*();
}