我有一些用于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属性?
我不想只排除模型包中的所有内容。
答案 0 :(得分:0)
我遇到了同样的问题。在您的示例中这样解决:
@JsonIgnoreProperties (ignoreUnknown = true)
class GetUserRequest (
@field:JsonProperty ("user_id")
var userId: String? = null
)
像这样的sgjesse said注释中的Kotlin数据类注释不会进入Java代码,因为在您的示例中,注释被应用于构造函数参数,而不是字段。
您可以详细了解@field:Annotation
here。
PS:
就我而言,这足以将对象序列化为JSON(以发出请求)。但是,如果反序列化,当接收回复时,此方法无效。
我需要添加的所有字段都是默认参数。但是您的示例中已经有它了,我只是为那些会遇到相同问题的人写的。