Джексон convertValue не использует JavaTimeModule - PullRequest
0 голосов
/ 15 ноября 2018

Если я создаю класс POJO и преобразую все объекты в Json, используя метод mapper.writeValueAsString(), или позволяю Spring обработать преобразование, JavaTimeModule используется надлежащим образом, и если в моем POJO было OffsetDateTime, этобудет преобразован в строку типа 2018-10-16T13:49:34.564748+02:00.

Для некоторых сценариев мне нужно использовать метод картографа T convertValue(Object fromValue, Class<T> toValueType) и собрать ObjectNode вручную.Метод не преобразует OffsetDateTime объекты так же, как writeValueAsString.

. Я создаю свой картограф Джексона следующим образом:

ObjectMapper defaultMapperObj = new ObjectMapper();
defaultMapperObj.registerModule(new GuavaModule());
defaultMapperObj.registerModule(new Jdk8Module());
defaultMapperObj.registerModule(new JavaTimeModule());
defaultMapperObj.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Используя картограф, я могу легко конвертироватьдаже перечисляет их строки Json:

mapper.convertValue(
        Arrays.asList(1,2,23), JsonNode.class
)

Результат:

ArrayNode: [1,2,23]

Но если я назову это:

mappper.convertValue(OffsetDateTime.now(), JsonNode.class)

, я получу DecimalNode:1542287917.2141993

1 Ответ

0 голосов
/ 15 ноября 2018

Из документации JavaTimeModule:

Большинство java.time типов сериализуются в виде чисел (в зависимости от целых чисел или десятичных знаков), если включена функция SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,и иначе сериализуются в стандартном строковом представлении ISO-8601.[...]

Таким образом, для достижения желаемого результата отключите функцию SerializationFeature.WRITE_DATES_AS_TIMESTAMPS в своем экземпляре ObjectMapper:

mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...