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

时间:2019-06-27 08:43:41

标签: 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”}

我包括了杰克逊对Kotlin的支持     实现“ com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9”     实施“ com.squareup.retrofit2:converter-jackson:2.6.0”

我有一些适用于我的java类模型对象的保护规则。

-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属性?

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

1 个答案:

答案 0 :(得分:0)

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

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

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

您可以详细了解@field:Annotation here

PS:

就我而言,这足以将对象序列化为JSON(以发出请求)。但是,如果反序列化,当接收回复时,此方法无效。

我需要添加的所有字段都是默认参数。但是您的示例中已经有它了,我只是为那些会遇到相同问题的人写的。