用于Kotlin改造的Jackson转换器



你好,很棒的社区。

我在到处(这里和其他地方(寻找一些本应简单的东西后,来到了这里。更确切地说,由于某些原因,我正在用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")解析了yearmonthday的日期,但也为其他人添加了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会非常简单。

最新更新