android - Proguard/R8 正在为 Jackson 缩小 Kotlin 数据类中的 @JsonProperty 注释名称

标签 android kotlin jackson retrofit2 proguard

我有一些用于 Retrofit2 的类,并由 Jackson 序列化。

@JsonIgnoreProperties(ignoreUnknown = true)
class GetUserRequest(
    @JsonProperty("user_id")
    var userId: String? = null
)

它们在调试版本中工作,但是当我在启用 proguard 或 R8 缩小的情况下进行发布构建时,它会缩小类变量(如预期的那样),但也会缩小@JsonProperty 生成的任何代码,从而导致网络请求与 json 一样{ "a": "123"} 而不是 { "user_id": "123"}

我已经包含了 jackson 对 kotlin 的支持
实现“com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9”
实现“com.squareup.retrofit2:converter-jackson:2.6.0”

而且我有一些适用于我的 java 类模型对象的 proguard 规则。
-keep class com.fasterxml.jackson.databind.ObjectMapper {
    public <methods>;
    protected <methods>;
}
-keep class com.fasterxml.jackson.databind.ObjectWriter {
    public ** writeValueAsString(**);
}
-keep class * {
     @com.fasterxml.jackson.annotation.JsonCreator *;
     @com.fasterxml.jackson.annotation.JsonProperty *;
}

-keepnames class com.fasterxml.jackson.** { *; }
-dontwarn com.fasterxml.jackson.databind.**
-keep class kotlin.Metadata { *; }

我需要添加哪些 proguard 规则才能使 Proguard 不会缩小 json 属性?

我不想只排除模型包中的所有内容。

最佳答案

我遇到了同样的问题。在您的示例中像这样解决了它:

@JsonIgnoreProperties (ignoreUnknown = true)
class GetUserRequest (
     @field:JsonProperty ("user_id")
     var userId: String? = null
)
像这样来自 Kotlin 数据类的注释不会进入 java 代码,因为 sgjesse said在注释中,在您的示例中,注释应用于构造函数参数,而不是字段。
您可以阅读有关 @field:Annotation 的更多信息here .
PS:
就我而言,这足以将对象序列化为 JSON(发出请求)。但是,这在 的情况下不起作用反序列化 , 当 收到回复 .
我只需要添加 默认参数适用于所有领域。但是你的例子中已经有了它,我只是为那些将面临同样问题的人写这个。

关于android - Proguard/R8 正在为 Jackson 缩小 Kotlin 数据类中的 @JsonProperty 注释名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56787233/

相关文章:

android - Ruboto:不会检测到 Android SDK 平台工具

android - Google Repository 不在 SDK 管理器中

kotlin - 在主线程中运行非阻塞协程

reflection - 我可以在纯 Kotlin 中通过类名实例化一个对象吗

java - 我的 CustomDeserializer 类在同一类的第二个字段上第二次不起作用

android - 使用 `onRetainCustomNonConfigurationInstance` 跨配置更改保留数据

java - android:创建新项目时可以选择目标sdk吗?

spring - 如何在 Spring Boot 测试中指定 text/plain;charset=UTF-8 的媒体类型

java - 使用 JBoss (6.2.0 GA) 在 EJB Jar 中忽略 Jackson 2 注释

java - 使用 Jackson 解析 JSON 节点内部的 JSON 节点