【问题标题】:How to configure ProGuard to respect Jackson model?如何配置 ProGuard 以尊重 Jackson 模型?
【发布时间】:2023-03-09 00:40:01
【问题描述】:

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

【问题讨论】:

    标签: java android gradle jackson proguard


    【解决方案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*(***);
          } 
          

          【讨论】:

          • 谢谢你,看到这很有意义,但即使在这么多年后我也不是很明显。
          猜你喜欢
          • 2017-06-12
          • 1970-01-01
          • 2015-09-29
          • 1970-01-01
          • 2015-02-25
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          相关资源
          最近更新 更多