Kotlin 数据类和 LocalDateTime

标签 kotlin jackson localdate data-class

我有票类:

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

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

Caused by: 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 ('2017-11-13T06:40:00Z') at [Source: UNKNOWN; line: -1, column: -1] (through reference chain: 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
)

如何修复它?

最佳答案

您的问题更多是关于 jackson 而不是 kotlin。
serialize/deserialize java 8 java.time with Jackson JSON mapper 中所述

你需要添加一个额外的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()

}

关于Kotlin 数据类和 LocalDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50627956/

相关文章:

kotlin - Kotlin 的兼容性政策是什么?

kotlin - 类内的扩展属性: Unresolved 引用:errorResponse

java - 如何使用 Jackson JSON 将 JSON 字符串转换为 Map<String, String>

java - 通过意图传递 mutableList

java - 使用Jackson(JSON)将Redis key 反序列化为字段值

web-services - 以每个请求、线程安全的方式设置 Jackson DeserializationContext 属性

elasticsearch - 为json中的数据选择正确的日期格式

java - 如何将 LocalDate 格式化为用户位置的标准格式?

java - LocalDate.plus 错误答案

android - `NoClassDefFoundError: android.databinding.DataBindingUtil` 运行带有数据绑定(bind)的 fragment 的 android 测试时