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

我从 ExtJS 得到一个日期字符串,格式如下:

“2011-04-08 T09: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);

我如何反序列化日期的方式,它是如何来的,没有时区的麻烦?

146773 次浏览

我找到了一个工作左右,但与此同时,我需要注释每个日期的整个项目的设定。在创建 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)

这对我很有用——我正在使用 Jackson 2.0.4

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

除了 Varun Achar 的回答之外,这是我想到的 Java8变体,它使用 Java.time。LocalDate 和 ZonedDateTime 代替旧的 java.util。约会课程。

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);
}
}

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