android - 使用 Kotlin 默认值的 Jackson 反序列化失败

标签 android kotlin jackson proguard

我正在使用 Jackson 反序列化来自 Retrofit 的 Json 响应。

我使用 Jackson Module Kotlin图书馆。

我的数据类对于 Java 表示为基元的某些值具有默认值,因此在没有空检查的情况下访问它时不会崩溃。

这在 debug 模式下一切正常,但是当我在启用 proguard 的 release 上运行时,未设置默认值并且这些值为 null,导致我的应用假设原语从 Java 访问它们时崩溃。

我已尝试添加可以在网上找到的所有 proguard 规则,但没有成功。

如果有人有任何想法,请分享。

谢谢

数据类示例

data class RideTask(@JsonProperty(RiderFrontendConsts.PARAM_LOCATION)
                    val location: UserVisibleLocation?,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_TS)
                    val etaTime: Double?,

                    @JsonProperty(RiderFrontendConsts.PARAM_TIME_TO_COMPLETION)
                    val timeToCompletion: Double?,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_DESCRIPTION)
                    val etaDescription: String?,

                    @JsonInclude(JsonInclude.Include.NON_NULL)
                    @JsonProperty(RiderFrontendConsts.PARAM_INTERNAL_ETA_TS)
                    val internalEta: Long? = 0,

                    @JsonProperty(RiderFrontendConsts.PARAM_ETA_DESCRIPTION_LIST)
                    val etaDescriptionList: List<String>?,

                    @JsonProperty(RiderFrontendConsts.PARAM_DESCRIPTION_PREFIX)
                    val descriptionPrefix: String?,

                    @JsonProperty(RiderFrontendConsts.PARAM_WALKING_DISTANCE_DESCRIPTION)
                    val walkingDistanceDescription: String?,

                    @JsonProperty(RiderFrontendConsts.PARAM_WALKING_DISTANCE_IN_METERS)
                    val walkingDistanceInMeters: Int? = 0)
    : Serializable

改造和 jackson 初始化

private Retrofit getRetrofit() {
    LOGGER.debug("prepare retrofit");
    return new Retrofit.Builder()
            .client(getHttpClient(RiderFrontendConsts.DEFAULT_TIMEOUT_IN_MILLIS))
            .baseUrl(SettingsManager.getInstance(Application.getInstance()).getServerBaseUrl())
            .addConverterFactory(JacksonConverterFactory.create(getObjectMapper()))
            .callbackExecutor(Executors.newCachedThreadPool())
            .build();
}

private static ObjectMapper getObjectMapper() {
    LOGGER.debug("prepare object mapper");
    return ExtensionsKt.jacksonObjectMapper()
            .enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING)
            .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
            .enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)
            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            .enable(SerializationFeature.WRITE_ENUMS_USING_INDEX)
            .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
            .setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.ANY)
            .setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE)
            .setVisibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE)
            .setVisibility(PropertyAccessor.IS_GETTER, JsonAutoDetect.Visibility.NONE);
}

相关职业守卫规则

#parsers
-keep class com.fasterxml.jackson.annotation.** { *; }
-dontwarn com.fasterxml.jackson.databind.**

# Kotlin
-keep class kotlin.Metadata { *; }
-keepclassmembers public class via.rider.frontend.** {
    public synthetic <methods>;
}

最佳答案

认为问题在于您必须添加规则才能保留字段名称,例如

-keep class your.package.model.** { <fields>; }

关于android - 使用 Kotlin 默认值的 Jackson 反序列化失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54061370/

相关文章:

android - Android 中的 values-sw 资源问题

java - 如何为 DynamoDB 设置时区在 spring 数据中自动生成时间戳

java - 我如何在 Micronaut/Kotest/Hibernate 测试中出现 "obtain transaction-synchronized Session for current thread"

hibernate - 如何使用 spring 将 postgres jsonb 列反序列化为对象列表?

java - 在屏幕上的任何地方触摸时隐藏和显示工具栏

java - butterknife 中的方法 "onClick"不起作用?

java - 将 TextView 添加到 Toolbar 的元素

spring-boot - [com.example.blog.SnapEngChatRequest] 和内容类型 [application/x-www-form-urlencoded] 没有 HttpMessageConverter

java - 忽略对象映射器级别的属性?

java - JSON 序列化时 jsonrpc4j null