Java 如何使用Jackson反序列化JS日期?
我从ExtJS获取一个日期字符串,格式如下: “2011-04-08T09:00:00” 当我尝试反序列化这个日期时,它会将时区更改为印度标准时间(时间加上+5:30)。这就是我反序列化日期的方式:Java 如何使用Jackson反序列化JS日期?,java,json,datetime,jackson,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);
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<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);
}
}
}
这对我很有用-我正在使用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,而不是旧的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);
}
}
公共类LocalDateDeserializer扩展JsonDeserializer{
@凌驾
公共LocalDate反序列化(JsonParser JsonParser,DeserializationContext DeserializationContext)引发IOException异常{
String String=jsonparser.getText();
if(string.length()>20){
ZonedDateTime ZonedDateTime=ZonedDateTime.parse(字符串);
返回zonedDateTime.toLocalDate();
}
返回LocalDate.parse(字符串);
}
}
关于这个话题有一个很好的博客:
使用@JsonFormat看起来是最简单的方法
public class Event {
public String name;
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}
@JsonFormat仅适用于您正在使用的jackson版本支持的标准格式
例如:-兼容jackson 2.8.6的任何标准格式(“yyyy-MM-dd'HH:MM:ss.SSSZ”,“yyyy-MM-dd'HH:MM:ss.SSS'Z'”,“EEE,dd-MM-MM yyyy:MM:ss-zzz”,“YY-MM-dd”))格式中的“T”是什么,不应该是“yyyy-MM-dd-HH:MM:ss”吗?这是一个有效的日期时间模式。例如,即使是'HH:MM:ss z处的
yyyy.MM.dd G'和HH'o''clock'a,zzzzzz
也是有效的模式。“T”的格式是,因为它使用的是ISO 8601日期-时间格式标准。显然,您不需要使用ISO标准格式,但在使用第三方库(如ExtJS)时,它有助于提高兼容性@不,这真的是错的。由于SimpleDataFormatter不是线程安全的,而且jackons缓存根级别的反序列化程序(这不能被禁用),您必须按照Varun Achar的建议为每个日期使用不同的SimpleDataFormatter,或者同步反序列化方法,因为您使用的是SimpleDataFormatter字段。这个字段不能是静态的。这是我见过的最恶心的虫子之一。这很有帮助,非常感谢。因为我使用的是Java 8,所以我发布了一个使用LocalDate的答案,请参见。或者,我使用了新的ISO8601DateFormat(),它与大多数其他语言的默认值(C#、Ruby等)是内联的。setDateFormat是否已被弃用?我是jackson的新手,我想知道在哪里添加上述代码?'objectMapper.setDateFormat(df);'如果您只有一个实用工具或一个唯一的bean来设置格式,那么这是很好的,否则您必须始终记住在使用它的任何地方设置它。此外,DateFormat不是线程安全的<代码>对象映射器
是线程安全的。对于每个配置,您只需要它的一个实例,即,如果您需要2种不同的日期格式,那么您需要2个ObjectMapper
对象,或者只有一个,但您需要同步对setDateFormat
方法的调用。您可以配置并使用Jackson的方法,而不是编写自己的反序列化程序。
public class Event {
public String name;
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
public Date eventDate;
}