2

以下课程描述了我使用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

4 回答 4

7

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

-keep public class com.example.models.Product {
  public *** get*();
  public void set*(***);
} 
于 2013-11-07T10:13:43.767 回答
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.xml 的 json 时出现错误。因此对于包含未混淆名称的 json,保留模型类的 getter 和 setter。

由于 getter 是 setter,所以在将 object 转换为 json 时,jackson 将混淆和未混淆的名称添加到 json (data duplication) 。为了防止这种情况,模型类的私有字段被保留。因此,现在 json 中只存在完整的未混淆字段。

参考页面以获取注释规则

于 2021-12-18T16:41:54.357 回答
0

您可以使用@jsonProperty注释

于 2013-11-08T04:56:34.303 回答
0

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

-keep class * implements java.io.Serializable
于 2018-05-10T08:22:21.607 回答