Сериализация Джексона OffsetDateTime как ISO-8601 не работает в jshell - PullRequest
1 голос
/ 28 сентября 2019

Используя jshell версии 11.0.1, я пытаюсь проверить сериализацию Джексона java.time.OffsetDateTime.Я хочу, чтобы он был сериализован в формате ISO-8601, но он не работает должным образом. Почему он все еще сериализуется как объект вместо ISO 8601?

вот как я запускаю jshell

jshell --class-path ~/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.8.9/jackson-databind-2.8.9.jar:~/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.8.9/jackson-core-2.8.9.jar:~/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.8.9/jackson-annotations-2.8.9.jar:~/.m2/repository/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.8.11/jackson-datatype-jsr310-2.8.11.jar

Вот код, который я запускаю в jshell

import com.fasterxml.jackson.databind.*;
import java.time.*;
import com.fasterxml.jackson.datatype.jsr310.*;
ObjectMapper mapper = new ObjectMapper();
mapper = mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.canSerialize(OffsetDateTime.class);
mapper.writeValueAsString(OffsetDateTime.now());

Вот вывод

|  Welcome to JShell -- Version 11.0.1
|  For an introduction type: /help intro

jshell> import com.fasterxml.jackson.databind.*;

jshell> import java.time.*;

jshell> import com.fasterxml.jackson.datatype.jsr310.*;

jshell> ObjectMapper mapper = new ObjectMapper();
mapper ==> com.fasterxml.jackson.databind.ObjectMapper@7fc229ab

jshell> mapper = mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper ==> com.fasterxml.jackson.databind.ObjectMapper@7fc229ab

jshell> mapper.canSerialize(OffsetDateTime.class);
$6 ==> true

jshell> mapper.writeValueAsString(OffsetDateTime.now());
$7 ==> "{\"offset\":{\"totalSeconds\":-25200,\"id\":\"-07:00\",\"rules\":{\"fixedOffset\":true,\"transitions\":[],\"transitionRules\":[]}},\"month\":\"SEPTEMBER\",\"dayOfWeek\":\"FRIDAY\",\"dayOfYear\":270,\"nano\":911405000,\"year\":2019,\"monthValue\":9,\"dayOfMonth\":27,\"hour\":16,\"minute\":33,\"second\":6}"

Почему он все еще сериализуется как объект вместо ISO 8601?

1 Ответ

0 голосов
/ 28 сентября 2019

После долгих недоразумений я обнаружил, что тот факт, что картограф утверждает, что он может сериализовать OffsetDateTime.class, не означает, что он распознает его как класс даты / времени.Мне нужно было добавить это к мапперу.

mapper = mapper.registerModule(new JavaTimeModule());

Теперь вывод

jshell> import com.fasterxml.jackson.databind.*;

jshell> import java.time.*;

jshell> import com.fasterxml.jackson.datatype.jsr310.*;

jshell> ObjectMapper mapper = new ObjectMapper();
mapper ==> com.fasterxml.jackson.databind.ObjectMapper@7fc229ab

jshell> mapper = mapper.registerModule(new JavaTimeModule());
mapper ==> com.fasterxml.jackson.databind.ObjectMapper@7fc229ab

jshell> mapper = mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper ==> com.fasterxml.jackson.databind.ObjectMapper@7fc229ab

jshell> mapper.canSerialize(OffsetDateTime.class);
$7 ==> true

jshell> mapper.writeValueAsString(OffsetDateTime.now());
$8 ==> "\"2019-09-27T16:41:07.921578-07:00\""
...