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

lbe*_*tto 5 android proguard jackson kotlin retrofit2

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

@JsonIgnoreProperties(ignoreUnknown = true)
class GetUserRequest(
    @JsonProperty("user_id")
    var userId: String? = null
)
Run Code Online (Sandbox Code Playgroud)

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

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

我有一些适用于我的 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 { *; }
Run Code Online (Sandbox Code Playgroud)

我需要添加哪些 proguard 规则,以便 Proguard 不会缩小 json 属性?

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

Vic*_*old 5

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

@JsonIgnoreProperties (ignoreUnknown = true)
class GetUserRequest (
     @field:JsonProperty ("user_id")
     var userId: String? = null
)
Run Code Online (Sandbox Code Playgroud)

像这样的 Kotlin 数据类的注释不会进入 java 代码,因为正如sgjesse在注释中所说,在您的示例中,注释应用于构造函数参数,而不是字段。

您可以@field:Annotation 在此处阅读更多相关信息。

附:

就我而言,这足以将对象序列化为 JSON(以发出请求)。但是,在收到响应时进行反序列化的情况下,这不起作用。

我需要添加的只是所有字段的默认参数。但你的例子中已经有了它,我只是为那些面临同样问题的人写这篇文章。