Как я могу использовать JSON JSON Mapper с Java 8 LocalDateTime?
org.codehaus.jackson.map.JsonMappingException: невозможно создать экземпляр значения типа [простой тип, класс java.time.LocalDateTime] из JSON String; нет однострокового конструктора / фабричного метода (через цепочку ссылок: MyDTO ["field1"] -> SubDTO ["date"])
Ответы:
Там нет необходимости использовать пользовательские сериализаторы / десериализаторы здесь. Используйте модуль datetime из jackson-modules-java8 :
Этот модуль добавляет поддержку для нескольких классов:
источник
registerModule(new JSR310Module())
илиfindAndRegisterModules()
. См. Github.com/FasterXML/jackson-datatype-jsr310, и здесь вы узнаете, как настроить объект mapper, если вы используете Spring Framework: stackoverflow.com/questions/7854030/…OffsetDateTime
@Test
public void testJacksonOffsetDateTimeDeserializer() throws IOException {
ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule());
String json = "\"2015-10-20T11:00:00-8:30\"";
mapper.readValue(json, OffsetDateTime.class);
}
objectMapper.registerModule(new JavaTimeModule());
. Как по сериализации, так и по десериализации.Обновление: оставив этот ответ по историческим причинам, но я не рекомендую его. Пожалуйста, смотрите принятый ответ выше.
Скажите Джексону, чтобы он отображал, используя ваши пользовательские классы сериализации:
предоставить пользовательские классы:
случайный факт: если я вкладываю классы выше и не делаю их статичными, сообщение об ошибке выглядит странно
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported
источник
LocalDateTimeSerializer
иLocalDateTimeDeserializer
Если вы используете класс ObjectMapper fastxml, по умолчанию ObjectMapper не понимает класс LocalDateTime, поэтому вам необходимо добавить еще одну зависимость в ваш gradle / maven:
Теперь вам нужно зарегистрировать поддержку типа данных, предлагаемую этой библиотекой, в объекте objectmapper, это можно сделать следующим образом:
Теперь в вашем jsonString вы можете легко поместить поле java.LocalDateTime следующим образом:
Сделав все это, ваш JSON-файл для преобразования объектов Java будет работать нормально, вы можете прочитать файл следующим образом:
источник
findAndRegisterModules()
была критическая часть, которая отсутствовала для меня при созданииObjectMapper
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Эта зависимость maven решит вашу проблему:
Одна вещь, с которой я столкнулся, это то, что часовой пояс ZonedDateTime меняется на GMT во время десериализации. Оказалось, что по умолчанию Джексон заменяет его одним из контекста. Для сохранения зоны необходимо отключить эту «функцию»
источник
DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE
мне также пришлось отключитьSerializationFeature.WRITE_DATES_AS_TIMESTAMPS
все, чтобы начать работать как надо.У меня была похожая проблема при использовании Spring boot . В Spring boot 1.5.1.RELEASE все, что мне нужно было сделать, это добавить зависимость:
источник
Если вы используете Джерси, вам нужно добавить зависимость Maven (jackson-datatype-jsr310), как предложили другие, и зарегистрировать свой экземпляр объектного сопоставления следующим образом:
При регистрации Джексона на ваших ресурсах, вам нужно добавить этот маппер следующим образом:
источник
Если вы не можете использовать
jackson-modules-java8
по каким-либо причинам, вы можете (де) сериализовать мгновенное поле,long
используя@JsonIgnore
и@JsonGetter
&@JsonSetter
:Пример:
доходность
источник
Я использую этот формат времени:
"{birthDate": "2018-05-24T13:56:13Z}"
для десериализации из json в java.time.Instant (см. Скриншот)источник
Это всего лишь пример того, как использовать его в модульном тесте, который я взломал для устранения этой проблемы. Ключевые ингредиенты
mapper.registerModule(new JavaTimeModule());
<artifactId>jackson-datatype-jsr310</artifactId>
Код:
источник
Вы можете установить это в своем
application.yml
файле, чтобы разрешить мгновенное время, которое является API даты в java8:источник
Если вы используете загрузку Spring и имеете эту проблему с OffsetDateTime, тогда вам нужно использовать registerModules, как было сказано выше @greperror (отвечено 28 мая '16 в 13:04), но обратите внимание, что есть одно отличие. Упомянутую зависимость не нужно добавлять, так как я предполагаю, что у весенней загрузки она уже есть. У меня была эта проблема с загрузкой Spring, и она работала для меня без добавления этой зависимости.
источник
Для тех, кто использует Spring Boot 2.x
Нет необходимости делать что-либо из вышеперечисленного - Java 8 LocalDateTime сериализуется / десериализуется из коробки. Мне нужно было сделать все вышеперечисленное в 1.x, но с Boot 2.x все работает без проблем.
См. Также эту ссылку JSON Java 8 LocalDateTime формат в Spring Boot
источник
Если у кого-то возникли проблемы при использовании,
SpringBoot
вот как я исправил проблему, не добавляя новую зависимость.В
Spring 2.1.3
Джексон ожидает строку даты2019-05-21T07:37:11.000
в этомyyyy-MM-dd HH:mm:ss.SSS
формате десериализации вLocalDateTime
. Убедитесь, что строка даты разделяет дату и время, аT
не сspace
. секунды (ss
) и миллисекунды (SSS
) могут быть опущены.источник
Если вы используете Jackson Serializer , вот способ использования модулей даты:
источник
Если вы решили использовать fastjson, вы можете решить свою проблему, обратите внимание на версию
источник
Если у вас возникла эта проблема из-за GraphQL Java Tools и вы пытаетесь упорядочить Java
Instant
из строки даты, вам нужно настроить SchemaParser для использования ObjectMapper с определенными конфигурациями:В своем классе GraphQLSchemaBuilder добавьте ObjectMapper и добавьте следующие модули:
и добавьте его в опции:
См. Https://github.com/graphql-java-kickstart/graphql-spring-boot/issues/32.
источник