У меня есть класс данных Kotlin, который сериализуется в JSON в проекте Spring Boot. Я хотел бы настроить форматирование даты при сериализации в JSON. Имя поля должно быть сериализовано с использованием правил по умолчанию. Это выражает то, что я хотел бы сделать:
class ZonedDateTimeSerialiser : JsonSerializer<ZonedDateTime>() {
@Throws(IOException::class)
fun serialize(value: ZonedDateTime, gen: JsonGenerator, serializers: SerializerProvider?) {
val parseDate: String? = value.withZoneSameInstant(ZoneId.of("Europe/Warsaw"))
.withZoneSameLocal(ZoneOffset.UTC)
.format(DateTimeFormatter.ISO_DATE_TIME)
gen.writeString(parseDate)
}
}
data class OrderNotesRequest(
@JsonSerialize(using = ZonedDateTimeSerialiser::class)
val date: ZonedDateTime = ZonedDateTime.now()
)
Но я получаю ошибку типа:
Type mismatch.
Required:
KClass<out (JsonSerializer<Any!>..JsonSerializer<*>?)>
Found:
KClass<ZonedDateTimeSerialiser>
Я попытался переключить параметр аннотации на contentUsing
, но ошибка типа осталась прежней.
... в вопросе SO, связанном с это. Я надеюсь, что это помогает.
Я думаю, вам нужно выразить это так, если вы хотите сохранить «дату» как имя в json - @JsonSerialize(using = ZonedDateTimeSerialiser.class) класс данных OrderNotesRequest(val date: ZonedDateTime = ZonedDateTime.now())
Следующее работает для меня
object JacksonRun {
@JvmStatic
fun main(args: Array<String>) {
val objMapper = ObjectMapper().apply {
registerModule(KotlinModule())
}
val order = OrderNotesRequest()
println(objMapper.writeValueAsString(order))
}
}
data class OrderNotesRequest(
@JsonSerialize(using = ZonedDateTimeSerialiser::class)
val date: ZonedDateTime = ZonedDateTime.now()
)
class ZonedDateTimeSerialiser : JsonSerializer<ZonedDateTime>() {
@Throws(IOException::class)
override fun serialize(value: ZonedDateTime, gen: JsonGenerator, serializers: SerializerProvider?) {
val parseDate: String = value.withZoneSameInstant(ZoneId.of("Europe/Warsaw"))
.withZoneSameLocal(ZoneOffset.UTC)
.format(DateTimeFormatter.ISO_DATE_TIME)
gen.writeString(parseDate)
}
}
build.gradle.kts:
dependencies {
implementation("com.fasterxml.jackson.core:jackson-core:2.13.2")
implementation("com.fasterxml.jackson.core:jackson-annotations:2.13.2")
implementation("com.fasterxml.jackson.core:jackson-databind:2.13.2")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.0")
}
Дает мне вывод:
{"date":"2022-03-21T10:29:19.381498Z"}
Убедитесь, что у вас есть правильный импорт для JsonSerializer
import com.fasterxml.jackson.databind.JsonSerializer
и добавьте маркер override
к методу serialize
это был импорт ?
У меня просто поверхностное знание Kotlin, но я думаю, что вы пропустили ключевое слово
override
при переопределении методаserialize
, это может быть связано с проблемой. Сказав это, остальная часть кода выглядит хорошо для меня. Пожалуйста, рассмотрите рабочие примеры в Модуль Джексона для Котлина или ...