2015-01-14 5 views
2

Jackson работает java.time.Instant с WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (READ_ также) включен по умолчанию. jackson-datatype-jsr310Jackson Java 8 Сериализация DateTime

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

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

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

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

+0

Причина, вероятно, что Джексон старается не потерять точность мгновенных есть. Приемником может быть не JavaScript. –

+0

Да, скорее всего, вы правы. Но нонос здесь действительно нули. Возможно, это больше для Java 8 java.time. –

ответ

3

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

Вы даже можете сделать простой 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:

Is there a way to use Java 8 lambda style to add custom Jackson serializer?

4

Я нашел, что это странно, так как с помощью классов JSR310Module как календарь или дата еще сериализовать в миллисекундах. Это не логично.

В документации 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^