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

Posted

技术标签:

【中文标题】如何配置 ProGuard 以尊重 Jackson 模型?【英文标题】:How to configure ProGuard to respect Jackson model? 【发布时间】:2013-11-16 14:15:24 【问题描述】:

以下类描述了我使用 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 仍然工作?

【问题讨论】:

【参考方案1】:

以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,所以在将 object 转换为 json 时,jackson 将混淆和未混淆的名称都添加到 json (data duplication)。为了防止这种情况,模型类的私有字段被保留。所以现在 json 中只有完整的未混淆字段。

注释规则参考this页面

【讨论】:

【参考方案2】:

在许多情况下,这些类已经实现了 Serializable 接口。根据您的项目,让所有这些类实现此接口可能是有意义的。如果是这样,请将此行添加到您的 proguard 配置中。

-keep class * implements java.io.Serializable

【讨论】:

【参考方案3】:

你可以使用@jsonProperty注解

【讨论】:

【参考方案4】:

我必须管理我简化了问题中的示例。该问题的解决方案是将 gettersetter 保留在 ProGuard 中,我必须在模型类中另外定义它们才能使 Jackson 工作。

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

【讨论】:

谢谢你,看到这很有意义,但即使在这么多年后我也不是很明显。

以上是关于如何配置 ProGuard 以尊重 Jackson 模型?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Proguard 处理 Jackson 库后混淆时出错

如何为 Jackson JSON 处理器设置 PROGUARD?

使用 Proguard 时使用 jackson-json 库的问题

Proguard 导致 100 个“找不到引用的类”警告,忽略 springframework 和 jackson 的保留规则

如何使用 Gradle 配置 Proguard?

启用 proguard 时出现杰克逊错误(缩小)