Как десериализовать дату 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); 

Как удалить десериализацию даты в том виде, в котором она происходит, без суеты часового пояса?

Я нашел работу, но с этим мне нужно будет аннотировать установщик каждой даты по всему проекту. Есть ли способ, которым я могу указать формат при создании ObjectMapper?

Вот что я сделал:

 public class CustomJsonDateDeserializer extends JsonDeserializer { @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); } } } 

И аннотировал каждый метод set-поля поля Date следующим образом:

 @JsonDeserialize(using = CustomJsonDateDeserializer.class) 

Это работает для меня – я использую jackson 2.0.4

 ObjectMapper objectMapper = new ObjectMapper(); final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); objectMapper.setDateFormat(df); 

В дополнение к ответу Варуна Ачара , это вариант Java 8, который я придумал, который использует java.time.LocalDate и ZonedDateTime вместо старых classов java.util.Date.

 public class LocalDateDeserializer extends JsonDeserializer { @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); } } 

Существует хороший блог об этой теме: 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; } 

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

Ex: – совместим с любой из стандартных форм («yyyy-MM-dd’T’HH: mm: ss.SSSZ», «yyyy-MM-dd’T’HH: mm: ss.SSS’Z», EEE, dd MMM yyyy HH: mm: ss zzz “,” yyyy-MM-dd “)) для jackson 2.8.6

  • JSONException: значение типа java.lang.String не может быть преобразовано в JSONObject
  • Разбирайте файл JSON с помощью GSON
  • Отображение данных JSON в JQGrid
  • Как генерировать и автоматически увеличивать Id с Entity Framework
  • Что значит .d в JSON?
  • По умолчанию для отсутствующих свойств в игре 2 формата JSON
  • MVC ajax json post для метода действия controllerа
  • Как преобразовать datatable в строку json с помощью json.net?
  • Как обращаться с Dynamic JSON в Модернизации?
  • Почему, когда конструктор аннотируется с помощью @JsonCreator, его аргументы должны быть аннотированы с помощью @JsonProperty?
  • ASP.NET MVC: управление сериализацией имен свойств с помощью JsonResult
  • Давайте будем гением компьютера.