如何配置 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】:我必须管理我简化了问题中的示例。该问题的解决方案是将 getter 和 setter 保留在 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 的保留规则