[英]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
是因为两个原因,当我收到null
对non-null
Object 的响应时,我没有收到任何错误或警告甚至崩溃,也没有任何Date
字段没有按照我的DateFormatter
格式化假如。
确实感觉我可能在此过程中错过了一些东西。我可以用其他方式做什么? 哦,我也试过@JsonFormat(pattern = "yyyy-MM-dd")
在一个特定的领域,但没有成功
稍后编辑:看起来经过更多调查,retrofit 并没有完全忽略我提供的日期格式,但它以某种方式对其进行了调整。 例如"date":"2022-08-24T13:23:10Z"
和SimpleDateFormat("yyyy-MM-dd")
它解析year
, month
, day
的日期,但也为其他人添加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.