Десериализация JSON в LocalTime

349
26 декабря 2017, 16:45

Всем привет.

Отправляю через POST-запрос следующий JSON:

{
    "name": "Дневная",
"startTime": {
        "hour": 12,
        "minute": 0,
        "second": 0,
        "nano": 000000000
    },
"finishTime": {
        "hour": 20,
        "minute": 0,
        "second": 0,
        "nano": 000000000
    },
    "type": 1000000017
}

Валится со следующим стектрейсом:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (PushbackInputStream); line: 4, column: 9] (through reference chain: ru.example.dto.ScheduleDto["startTime"])

Я так понимаю, Jackson не может десериализовать JSON в LocalTime. Подскажите, как решить проблему.

Зависимости какие надо есть:

compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.9.2'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.2'
Answer 1

Там все просто. Добавляете эту зависимость

https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310

Потом при создании ObjectMapper регистрируете модуль так, как показано ниже, и будет вам счастье

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
Answer 2

Проблема была решена следующим образом.

Как и рекомендовал Дмитрий Александрович, я добавил зависимость. Потом добавил бин:

@Bean
public ObjectMapper jsonObjectMapper() {
    return Jackson2ObjectMapperBuilder.json()
            .modules(new JavaTimeModule())
            .build();
}

Jackson стал сериализовать / десериализовать следующим образом:

"startTime": [
        20,
        0
    ],

почему-то отсекая всё, что меньше минуты, хотя, в сериалайзере прописано всё вплоть до nano:

package java.time.format:380
ISO_LOCAL_TIME = (new DateTimeFormatterBuilder()).appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':').appendValue(ChronoField.MINUTE_OF_HOUR, 2).optionalStart().appendLiteral(':').appendValue(ChronoField.SECOND_OF_MINUTE, 2).optionalStart().appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter(ResolverStyle.STRICT, (Chronology)null);

Добавил JsonFormatter:

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
    private LocalTime startTime;

и стало принимать / выдавать следующее:

"startTime": "02:00:00",
READ ALSO
Работа с HQL HIBERNATE

Работа с HQL HIBERNATE

Не понимаю в чем проблема

223
Android Studio “Caller did not enable length changes; not transforming text”

Android Studio “Caller did not enable length changes; not transforming text”

Делаю Android приложениеКакое, не особо важно

363
-Djava.ext.dirs не поддерживается?

-Djava.ext.dirs не поддерживается?

Пытаюсь запустить собранное приложение appjar из командной строки приблизительно такой командой:

244