#java #json #jackson #date-format
#java #json #джексон #формат даты
Вопрос:
используя библиотеку jackson, преобразуйте строку json в объект kotlin
ошибка
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2019-01-14T18:50:31.856 09:00')
at [Source: (String)"{"name": "Kolineer", "age": "26", "messages" : ["message a","message b"],"transacted_at":"2019-01-14T18:50:31.856 09:00"}"; line: 1, column: 90] (through reference chain: com.test.utils.Person["transacted_at"])
это код
data class Person(val name: String, val age: Int, val messages: List<String>,
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
@JsonProperty("transacted_at")
val transactedAt: LocalDateTime )
fun main(args: Array<String>) {
val json = """{"name": "Kolineer", "age": "26", "messages" : ["message a","message b"],"transacted_at":"2019-01-14T18:50:31.856 09:00"}"""
val mapper = jacksonObjectMapper()
mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
var person: Person = mapper.readValue<Person>(json)
println(person)
}
Комментарии:
1. Я не знаю, влияет ли это на вашу проблему: 2019-01-14T18:50:31.856 09:00 больше похоже на
OffsetDateTime
. УLocalDateTime
A нет смещения ( 09:00).
Ответ №1:
Чтобы сериализовать / десериализовать классы даты и времени Java 8, вам необходимо использовать этот модуль jackson.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.8</version>
</dependency>
Чтобы вручную зарегистрировать этот модуль в ObjectMapper,
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
Примечание: Если вы не знакомы с синтаксисом kotlin, пожалуйста, преобразуйте приведенный выше Java-код в kotlin.