Как десериализовать дату JS, используя Джексона? - PullRequest
66 голосов
/ 08 апреля 2011

Я получаю строку даты из 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 ]

133 голосов
/ 08 апреля 2011

Я нашел обходной путь, но с этим мне нужно будет комментировать каждый установщик даты на протяжении всего проекта. Есть ли способ, которым я могу указать формат при создании 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)
54 голосов
/ 31 августа 2012

Это работает для меня - я использую Джексон 2.0.4

ObjectMapper objectMapper = new ObjectMapper();
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
objectMapper.setDateFormat(df);
12 голосов
/ 14 сентября 2016

Есть хороший блог на эту тему: 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;
}
6 голосов
/ 04 августа 2015

В дополнение к ответу Варуна Ачара , это вариант 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);
    }
  }
0 голосов
/ 23 января 2017

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

Пример: - совместим с любой из стандартных форм ("гггг-ММ-дд'Т'ХХ: мм: сс.SSSZ "," гггг-ММ-дд'ТХХ: мм: сс.ССС'З '"," ЭЭЭ, дд МММ гггг ЧЧ: мм: сс zzz "," гггг-ММ-дд ")) для Джексона2.8.6

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...