У меня есть формат даты из API, как это:
"start_time": "2015-10-1 3:00 PM GMT+1:00"
Который является ГГГГ-ДД-ММ ЧЧ: ММ am / pm GMT timestamp. Я сопоставляю это значение с переменной Date в POJO. Очевидно, это показывает ошибку преобразования.
Я хотел бы знать 2 вещи:
- Какое форматирование мне нужно использовать для конвертации с Джексоном? Является ли Date хорошим типом поля для этого?
- В общем, есть ли способ обработать переменные до того, как Джексон сопоставит их с членами Object? Что-то вроде смены формата, расчетов и т. Д.
Date
класс. java.time, современный API даты и времени Java, заменил его почти 5 лет назад. Используйте его и FasterXML / jackson-modules-java8 .Ответы:
Date
это хороший тип поля для этого. Вы можете довольно легко разобрать JSON, используяObjectMapper.setDateFormat
:Да. У вас есть несколько вариантов, включая реализацию кастома
JsonDeserializer
, например расширениеJsonDeserializer<Date>
. Это хорошее начало.источник
LocalDateTime
илиZonedDateTime
вместоDate
? ТакDate
как в основном устарел (или, по крайней мере, многие из его методов), я хотел бы использовать эти альтернативы.java.util.Date
я хочу отметить, что это не работает.java.sql.Date.
См. Также мой ответ ниже.Начиная с Jackson v2.0, вы можете использовать аннотацию @JsonFormat непосредственно для членов Object;
источник
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone="GMT")
Конечно, существует автоматизированный способ, называемый сериализацией и десериализацией, и вы можете определить его с помощью специальных аннотаций ( @JsonSerialize , @JsonDeserialize ), как также упоминалось в pb2q.
Вы можете использовать java.util.Date и java.util.Calendar ... и, возможно, также JodaTime.
Аннотации @JsonFormat не работали для меня так, как я хотел (он настроил часовой пояс на другое значение) во время десериализации (сериализация работала отлично):
Вам нужно использовать пользовательский сериализатор и пользовательский десериализатор вместо аннотации @JsonFormat, если вы хотите получить прогнозируемый результат. Я нашел очень хороший учебник и решение здесь http://www.baeldung.com/jackson-serialize-dates
Есть примеры для полей даты, но мне нужно было для полей календаря, вот моя реализация :
Класс сериализатора :
Класс десериализатора :
и использование вышеперечисленных классов:
Используя эту реализацию, выполнение процесса сериализации и десериализации последовательно приводит к значению источника.
Только используя аннотацию @JsonFormat, десериализация дает другой результат, я думаю, из-за установки по умолчанию внутреннего часового пояса библиотеки, которую вы не можете изменить с параметрами аннотации (это был мой опыт работы с библиотекой Jackson версий 2.5.3 и 2.6.3).
источник
Просто полный пример для весенней загрузки приложения с
RFC3339
форматом datetimeисточник
Чтобы добавить символы, такие как T и Z в вашей дате
вывод
источник
Работаю на меня. SpringBoot.
вывод:
источник
Основываясь на очень полезном ответе @ miklov-kriven, я надеюсь, что эти два дополнительных соображения окажутся полезными для кого-то:
(1) Я считаю хорошей идеей включить сериализатор и десериализатор как статические внутренние классы в одном классе. NB, используя ThreadLocal для безопасности потоков SimpleDateFormat.
(2) В качестве альтернативы использованию аннотаций @JsonSerialize и @JsonDeserialize для каждого отдельного члена класса вы также можете рассмотреть возможность переопределения сериализации по умолчанию Джексона, применяя пользовательскую сериализацию на уровне приложения, то есть все члены класса типа Date будут сериализованы Джексоном. используя эту пользовательскую сериализацию без явной аннотации для каждого поля. Если вы используете Spring Boot, например, один из способов сделать это будет следующим:
источник
Если у кого-то есть проблемы с использованием пользовательского формата даты для java.sql.Date, это самое простое решение:
(Этот SO-ответ избавил меня от многих проблем: https://stackoverflow.com/a/35212795/3149048 )
Джексон по умолчанию использует SqlDateSerializer для java.sql.Date, но в настоящее время этот сериализатор не учитывает формат даты, см. Эту проблему: https://github.com/FasterXML/jackson-databind/issues/1407 . Обходной путь должен зарегистрировать другой сериализатор для java.sql.Date, как показано в примере кода.
источник
Я хочу отметить, что установка
SimpleDateFormat
подобного, описанного в другом ответе, работает только для того,java.util.Date
что, как я полагаю, подразумевается в вопросе. Но дляjava.sql.Date
форматера не работает. В моем случае было не очень очевидно, почему форматер не работал, потому что в модели, которая должна быть сериализована, поле было фактически a,java.utl.Date
но фактический объект в конечном итоге был ajava.sql.Date
. Это возможно, потому чтоТак что на самом деле это действительно
Поэтому, если вам интересно, почему ваше поле Date не отформатировано правильно, убедитесь, что объект действительно a
java.util.Date
.Здесь также упоминается, почему обработка
java.sql.Date
не будет добавлена.источник
Date
классов. В наши дни ни один из них не должен ни, ни, ниSimpleDateFormat
. java.time, современный API даты и времени Java, заменил их почти 5 лет назад. Используйте его и FasterXML / jackson-modules-java8 .