Как десериализовать дату JS с помощью Jackson?
Я получаю строку даты от ExtJS в формате:
"2011-04-08T09:00:00"
когда я пытаюсь десериализовать эту дату, он меняет часовой пояс на индийское стандартное время (добавляет +5:30 на время) . Вот как я десериализую дату:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
это также не меняет часовой пояс. Я все еще получаю дату в IST:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
getObjectMapper().getDeserializationConfig().setDateFormat(dateFormat);
Как мне десериализовать дату так, как это происходит без суета часового пояса?
5 ответов:
Я нашел работу вокруг, но с этим мне нужно будет аннотировать каждый сеттер даты на протяжении всего проекта. Есть ли способ, которым я могу указать формат при создании ObjectMapper?
вот что я сделал:
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); String date = jsonParser.getText(); try { return format.parse(date); } catch (ParseException e) { throw new RuntimeException(e); } } }
и аннотировал метод сеттера каждого поля даты следующим образом:
@JsonDeserialize(using = CustomJsonDateDeserializer.class)
это работает для меня - я использую Джексон 2.0.4
ObjectMapper objectMapper = new ObjectMapper(); final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); objectMapper.setDateFormat(df);
есть хороший блог на эту тему: http://www.baeldung.com/jackson-serialize-dates Использование @JsonFormat выглядит наиболее простым способом.
public class Event { public String name; @JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss") public Date eventDate; }
кроме Рави Ачар-это, Это вариант Java 8, который я придумал, который использует java.время.LocalDate и ZonedDateTime вместо старой java.утиль.Дата занятий.
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> { @Override public LocalDate deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException { String string = jsonparser.getText(); if(string.length() > 20) { ZonedDateTime zonedDateTime = ZonedDateTime.parse(string); return zonedDateTime.toLocalDate(); } return LocalDate.parse(string); } }