Как десериализовать дату JS с помощью Джексона?
Я получаю строку даты из 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);
Как десериализовать дату в том виде, в котором она идет, без суеты Часовой пояс?
Ответы
Ответ 1
Я нашел работу, но с этим мне нужно будет аннотировать каждый установщик даты во всем проекте. Есть ли способ, которым я могу указать формат при создании 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
Это работает для меня - я использую jackson 2.0.4
ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);
Ответ 3
В дополнение к Varun Achar answer, это вариант Java 8, который я придумал, который использует java.time.LocalDate и ZonedDateTime вместо старой java. util.Date.
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);
}
}
Ответ 4
Есть хороший блог об этой теме:
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;
}
Ответ 5
@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