繁体   English   中英

Jackson 转换器,用于 Kotlin 中的 Retrofit

[英]Jackson Converter for Retrofit in Kotlin

你好很棒的社区。

在查看了所有地方(这里和其他地方)关于应该简单的事情之后,我最终来到了这里。 更准确地说,由于某些原因,我正在用Jackson替换GSON库。

基本上,最让我烦恼的是,我的Jackson Converter似乎被Retrofit或其他东西忽略了。

我尝试了什么:

private val retrofit: Retrofit by lazy {
    Retrofit.Builder()
        .addConverterFactory(
            JacksonConverterFactory.create(jackson)
        )
        .baseUrl(BASE_URL)
        .client(httpClient)
        .build()
}

其中jackson也是我正在编写的此ApiClient的一部分

private val jackson: ObjectMapper by lazy {
    ObjectMapper()
        .registerModule(jacksonKotlinModule)
        .setDateFormat(
            SimpleDateFormat(
                "yyyy-MM-dd",
                Locale.getDefault()
            )
        )
}

当然还有jacksonKotlinModule

private val jacksonKotlinModule: KotlinModule by lazy {
    KotlinModule.Builder()
        .configure(KotlinFeature.StrictNullChecks, true)
        .build()
}

当 POJO 的 Kotlin non-null字段从端点的响应中接收到null值时,所有这些都是为了得到一个错误。

On top of this, I tried the way found in every tutorials about Jackson & Kotlin which is just using jacksonObjectMapper() method available in com.fasterxml.jackson.module.kotlin

为什么我说这seems to be ignored是因为两个原因,当我收到nullnon-null Object 的响应时,我没有收到任何错误或警告甚至崩溃,也没有任何Date字段没有按照我的DateFormatter格式化假如。

确实感觉我可能在此过程中错过了一些东西。我可以用其他方式做什么? 哦,我也试过@JsonFormat(pattern = "yyyy-MM-dd")在一个特定的领域,但没有成功

稍后编辑:看起来经过更多调查,retrofit 并没有完全忽略我提供的日期格式,但它以某种方式对其进行了调整。 例如"date":"2022-08-24T13:23:10Z"SimpleDateFormat("yyyy-MM-dd")它解析yearmonthday的日期,但也为其他人添加00 .. Output 是: Wed Aug 24 00:00:00 GTM+03:00 2022

您是否在要解析 JSON 的类中的所有属性之前添加了@JsonProperty注释? 我认为您可能会错过它,这就是它不起作用的原因。

当您直接使用 OkHttp 时,您可以指定使用jacksonObjectMapper() ,它使用 jackson kotlin 模块。 在构建 Retrofit object 时,您不能这样做,因为addConverterFactory()方法采用 Converter.Factory 类型,而jacksonObjectMapper()返回ObjectMapper ,而不是工厂。 这就是为什么您必须在每个字段之前添加@JsonProperty的原因。

我认为创建自己的 class 扩展 Converter.Factory 但返回 ObjectMapper 并添加 kotlin 模块将非常简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM