Search code examples
javajsonjacksondate-format

Json parse error with jackson, InvalidDefinitionException occurs while converting to java.time.LocalDateTime


using jackson library covert json string to kotlin object

error

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"])

this is code

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)
}

Solution

  • To serialize / deserialize Java 8 date / time classes, you need to use this jackson module.

    <dependency>
      <groupId>com.fasterxml.jackson.datatype</groupId>
      <artifactId>jackson-datatype-jsr310</artifactId>
      <version>2.8.8</version>
    </dependency>
    

    To manually register this module to ObjectMapper,

    ObjectMapper mapper = new ObjectMapper();
    mapper.findAndRegisterModules();
    

    Note: Not aware of kotlin syntax, please convert above java code into kotlin.