你好,很棒的社区。
我在到处(这里和其他地方(寻找一些本应简单的东西后,来到了这里。更确切地说,由于某些原因,我正在用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的Kotlinnon-null
字段从端点的响应接收到null
值时,我试图得到一个错误。
除此之外,我尝试了在每一个关于Jackson & Kotlin
的教程中找到的方法,它只是使用com.fasterxml.jackson.module.kotlin
中可用的jacksonObjectMapper()
方法
为什么我说seems to be ignored
是因为两个原因,当我得到non-null
对象的null
响应时,我既没有得到任何错误或警告,甚至没有崩溃,也没有任何Date
字段没有按照我提供的DateFormatter
进行格式化。
我确实觉得一路上我可能错过了什么。。我还能用其他方式做什么?哦,我也在特定领域尝试过@JsonFormat(pattern = "yyyy-MM-dd")
,但没有成功
稍后编辑:看起来经过更多的调查,改装并没有完全忽略我提供的日期格式,但它以某种方式进行了调整。例如"date":"2022-08-24T13:23:10Z"
和SimpleDateFormat("yyyy-MM-dd")
解析了year
、month
、day
的日期,但也为其他人添加了00
。。输出为:Wed Aug 24 00:00:00 GTM+03:00 2022
您是否在解析JSON的类中的所有属性之前添加了@JsonProperty
注释?我想你可能错过了它,这就是为什么它不起作用。
当您直接使用OkHttp时,您可以指定使用jacksonObjectMapper()
,它使用jackson-kotlin模块。在构建Reform对象时不能这样做,因为addConverterFactory()
方法采用Converter.Factory类型,jacksonObjectMapper()
返回ObjectMapper
,而不是工厂。这就是为什么必须在每个字段之前添加@JsonProperty
。
我认为创建自己的类来扩展Converter.Factory,但返回添加了kotlin模块的ObjectMapper会非常简单。