如何使用Jackson反序列化JS日期?

时间:2011-04-08 07:38:12

标签: java json datetime 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 个答案:

答案 0 :(得分:133)

我找到了一个解决方法但是我需要在整个项目中注释每个日期的设置器。有没有一种方法可以在创建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);
        }

    }

}

并使用以下方法注释每个Date字段的setter方法:

@JsonDeserialize(using = CustomJsonDateDeserializer.class)

答案 1 :(得分:54)

这对我有用 - 我使用的是jackson 2.0.4

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

答案 2 :(得分:12)

有一个关于这个主题的好博客: 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;
}

答案 3 :(得分:6)

除了Varun Achar's 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 :(得分:-2)

@JsonFormat仅适用于您使用的jackson版本支持的标准格式。

Ex: - 兼容任何标准表格(&#34; yyyy-MM-dd&#39; T&#39; HH:mm:ss.SSSZ&#34;,&#34; yyyy-MM-dd&# 39; T&#39; HH:mm:ss.SSS&#39; Z&#39;&#34;,&#34; EEE,dd MMM yyyy HH:mm:ss zzz&#34;,&#34; yyyy- MM-dd&#34;))对于杰克逊2.8.6