如何配置ProGuard以尊重Jackson模型?

3
以下类描述了我使用Jackson 2.2从.json文件中读取的模型。
public class Product {
    public String name;
    public int width;
}

Gradle的构建过程调用ProGuard来缩小和混淆发布版本的代码。当我启动应用程序时,出现以下错误消息:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 
  Unrecognized field "name" (class com.example.b.c), 
  not marked as ignorable (0 known properties: ])

我该如何配置ProGuard或为Product类添加注释,以便Jackson仍然可以正常工作?
4个回答

7

我必须承认我在我的问题中简化了示例。解决问题的方法是保留ProGuard中的gettersetter,并且我还需要在模型类中进行额外定义以使Jackson工作。

-keep public class com.example.models.Product {
  public *** get*();
  public void set*(***);
} 

1
谢谢,看到这个让我感觉很有道理,但即使过了这么多年,对我来说也并不明显。 - Blacklight

2

JJD 的回答基础上,对于我的使用场景有所帮助的是:

#json contaning unobfuscated names can be read and set by Jackson
-keep public class com.xyz.yourmodel,com.xyz.c.yourmodel2,com.xyz.models.** {
    private <fields>;
    public void set*(***);
    public *** get*();
}

#to preserve Jackson annotations like @JsonIgnore
-keepclassmembers class * {
    @com.fasterxml.jackson.annotation.* *;
}

#dont throw warnings from here
-dontwarn com.fasterxml.jackson.databind.**

我在Android应用程序中使用jackson将对象转换为json并将json转换为对象。该应用程序还从具有完整字段名称的Web应用程序接收json。由于Android中的proguard混淆了所有名称,因此仅在处理来自Web的json时才会出现错误。
因此,对于包含未混淆名称的json,模型类的getter和setter被保留。由于getter和setter被保留,因此在将对象转换为json时,jackson将同时添加混淆和未混淆名称到json中(数据重复)。为了防止这种情况,模型类的私有字段被保留。因此,现在只有完整的未混淆字段存在于json中。
参考页面以获取注释规则。

0
在许多情况下,这些类已经实现了Serializable接口。根据您的项目,保留所有实现此接口的类可能是有意义的。如果是这样,请将此行添加到您的proguard配置中。
-keep class * implements java.io.Serializable

0

您可以使用@jsonProperty注释


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接