4

我有机票类:

data class Ticket(
        var contact_email : String? = null,
        var date_opened : LocalDateTime? = null
)

但我在从字符串读取时出错:

引起:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造实例java.time.LocalDateTime(没有创建者,如默认构造,存在):没有从字符串值反序列化的字符串参数构造函数/工厂方法('2017-11-13T06 :40:00Z') 在 [来源:未知;行:-1,列:-1](通过参考链:rnd_classifier.model.Ticket["date_opened"])

我尝试添加注释但没有成功:

data class Ticket(
        var contact_email : String? = null,

        @JsonSerialize(using = ToStringSerializer::class)
        @JsonDeserialize(using = LocalDateTimeDeserializer::class)
        var date_opened : LocalDateTime? = null
)

如何修复它?

4

1 回答 1

7

您的问题更多是关于杰克逊而不是科特林。如使用 Jackson JSON 映射器序列化/反序列化 java 8 java.time 中所述

你需要添加一个额外的 gradle 依赖来解决它

implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.5")

之后它应该工作

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import org.testng.annotations.Test
import java.time.LocalDateTime

class SoTest {

    data class Ticket(
            var contact_email: String? = null,
            var date_opened: LocalDateTime? = null
    )

    @Test
    fun checkSerialize() {
        val mapper = ObjectMapper()
        mapper.registerModule(JavaTimeModule())
        val ticket = mapper.readValue(inputJsonString, Ticket::class.java)
        assert ("$ticket"=="Ticket(contact_email=contact@ema.il, date_opened=2017-11-13T06:40)")
    }

    val inputJsonString = """{
        "contact_email": "contact@ema.il",
        "date_opened": "2017-11-13T06:40:00Z"
    }""".trimIndent()

}
于 2018-05-31T16:49:42.707 回答