【问题标题】:@SerializedName not working with Proguard@SerializedName 不适用于 Proguard
【发布时间】:2021-04-26 23:39:19
【问题描述】:

在使用 Proguard 的项目上的 minifyEnabled true 上,使用 Gson 时未正确解析 ApiError 类。

data class ApiResponse<D>(
    @SerializedName("status") @Expose val status: String,
    @SerializedName("data") @Expose val data: D?,
    @SerializedName("error") @Expose val error: ApiError?
)

data class ApiError(
    @SerializedName("code") @Expose val code: Int,
    @SerializedName("message") @Expose val msg: String,
    @SerializedName("title") @Expose val title: String?
)

以下代码给出了一个 ApiResponse 对象,其中 ApiError 没有正确解析。

val collectionType = object : TypeToken<ApiResponse<User>?>() {}.type
                        val gson = GsonBuilder()
                        val errorBody: ApiResponse<T> = gson.create().fromJson(stringObj, collectionType)

ApiError 上添加@Keep 可以解决问题,但@SerializedName 不应该这样做吗? 有趣的是,ApiResponse 的每个字段都被正确解析。 我们和this one有同样的proguard规则

【问题讨论】:

  • 你应该在你的 proguard 规则中保留数据类
  • @Rolud 为什么有什么具体原因?

标签: android gson proguard


【解决方案1】:

如果您希望您的模型仍然被混淆,请使用注解 @SerializedName("name_of_json_key")。它会让 gson 知道该字段的真实名称。

-keepattributes *Annotation* 在您的 proguard-rules.pro 文件中。 这将使您的注释不被混淆

【讨论】:

    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2019-09-12
    • 2020-05-26
    相关资源
    最近更新 更多