Джексон Java 8 DateTime сериализация

Джексон работает с java.time.Instant с включенным WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (также READ_) по умолчанию. jackson-datatype-jsr310

Он производит такой JSON

{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }

В JavaScript гораздо проще получить дату из традиционной метки времени в миллисекундах (а не из секунд / нанометров, как указано выше), например new Date(1421261297356).

Я думаю, должна быть какая-то причина для использования подхода наноразмеров по умолчанию, так что это за причина?


person Andrii Karaivanskyi    schedule 14.01.2015    source источник
comment
Причина, вероятно, в том, что Джексон старается не терять точности Instant. Получателем может быть не JavaScript.   -  person JB Nizet    schedule 15.01.2015
comment
Да скорее всего ты прав. Но ноно здесь действительно нули. Возможно, это больше для Java 8 java.time.   -  person Andrii Karaivanskyi    schedule 15.01.2015


Ответы (2)


Один из способов - создать собственный модуль Джексона и выполнить необходимую вам сериализацию.

Вы даже можете создать простой Jackson8Module, который расширяет Jackson SimpleModule и предоставляет некоторые методы, дружественные к лямбда.

ObjectMapper jacksonMapper = new ObjectMapper();
Jackson8Module module = new Jackson8Module();
module.addStringSerializer(LocalDate.class, (val) -> val.toString());
module.addStringSerializer(LocalDateTime.class, (val) -> val.toString());
jacksonMapper.registerModule(module);

Вот код для Jackson8Module:

Есть ли как использовать лямбда-стиль Java 8 для добавления собственного сериализатора Джексона?

person Jeremy Chone    schedule 26.01.2015

Мне это показалось странным, поскольку использование классов JSR310Module, таких как Calendar или Date, по-прежнему сериализуется в миллисекундах. Это не логично.

В документации JSR310Module (https://github.com/FasterXML/jackson-datatype-jsr310) у них есть ссылка на это:

Для сериализации временные метки записываются в виде дробных чисел (десятичных знаков), где число - секунды, а десятичное - дробные секунды, если WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS включен (по умолчанию), с разрешением до наносекунд в зависимости от базовой реализации JDK. Если WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS отключен, временные метки записываются в виде целого числа миллисекунд.

Итак, простое решение для того, чего вы хотите достичь, - это настроить свой картограф, как они говорят:

  mapper.configure( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false );
  mapper.configure( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true );
person Pedro Sequeira    schedule 05.09.2016
comment
WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS - действительно сбивающее с толку имя, потому что оно действительно делает: оно записывает временные метки как СЕКУНДЫ (а не НАНОСЕКУНДЫ) с дробной частью. И эта дробная часть содержит до 6 цифр после точки, поэтому ее можно интерпретировать как часть в наносекунды, но все значение по-прежнему выражается в секундах. - person Ruslan Stelmachenko; 15.12.2018
comment
mapper.configure () - где это делать? Вы знаете, как это сделать в XML? - person veritas; 10.01.2021