如果我打开proguard,则不会调用JsonAnySetter

时间:2013-12-08 08:56:41

标签: jackson proguard

我对JsonAnySetter有疑问。如主题中所述,当我打开proguard时,我的JsonAnySetter处理程序未被调用。 如果关闭proguard就行了。 以下是我的测试代码和proguard设置。 肯定JsonProperty注释运作良好。它没有被我的proguard配置删除。

public class TestJson
{
  public static class Item1
  {
  @JsonAnySetter
  public void handleUnknown(String key, Object val)
  {
    System.out.println(String.format("unknown : %s - %s", key, val.toString()));
  }
  @JsonProperty("uid")
  public long uid_ = 0;
  public static void test()
  {
    ObjectManager m = new ObjectMapper();
    m.setVisibilityChecker(....None...)

    String j1 = "{\"uid\":5, \"pos\":5, \"kk\":888, \"attr\":5}";
    Item1 item = (Item1) m.readValue(j1, Item1.class);
  }
}

以下是我使用的proguard配置。

-dontobfuscate
-dontoptimize
-printusage
-dontwarn
-keepattributes *Annotation*,EnclosingMethod,Signature
-keepnames class com.fasterxml.jackson.** { *; }
-keepclassmembers enum * {
  public static **[] values();
  public static ** valueOf(java.lang.String);
}

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService
-keepclasseswithmembernames class * {
  native <methods>;
}
-keepclasseswithmembers class * {
  public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmember class * {
  public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * {
  @fully.qualified.package.AnnotationType *;
}
-keep public class cca.news.TestJson.** { *; }

有没有人可以解决我的这个问题? 我需要proguard和Jackson的JsonAnySetter处理程序。

1 个答案:

答案 0 :(得分:2)

杰克逊通过反思访问字段uid和方法handleUnknown。 ProGuard无法通过分析代码来了解这一点,因此您需要保留它们:

-keepclassmembers class cca.news.TestJson$Test {
    public void handleUnknown(java.lang.String, java.lang.Object);
    public long uid_;
}

请注意内部类的$ - 与.匹配的行不会匹配,但您确实可以使用各种通配符和模式。

您还需要保留注释:

-keep @interface com.fasterxml.jackson.**

请注意-keep选项 - 使用-keepnames的行不够,但您确实可以保留所有类。