Java 使用ObjectMapper';setDateFormat';和使用@JsonDeserialize的自定义日期反序列化程序
我正在尝试使用将文件中的JSON转换为Java对象 JSON文件:sample-date-str.JSONJava 使用ObjectMapper';setDateFormat';和使用@JsonDeserialize的自定义日期反序列化程序,java,json,date,simpledateformat,json-deserialization,Java,Json,Date,Simpledateformat,Json Deserialization,我正在尝试使用将文件中的JSON转换为Java对象 JSON文件:sample-date-str.JSON { "eventDate"="2017-06-27 10:04:26.573503+05:30" } javapojo:SampleDatePOJO class SampleDatePOJO{ private Date eventDate; getter and setter.... toString... } 用于将JSON转换为Java对象的J
{
"eventDate"="2017-06-27 10:04:26.573503+05:30"
}
javapojo:SampleDatePOJO
class SampleDatePOJO{
private Date eventDate;
getter and setter....
toString...
}
用于将JSON转换为Java对象的Java代码:
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSX")); //this will convert Date to IST format which is okay.
SampleDatePOJO sampleDatePOJO = mapper.readValue(new File("sample-date-str.json"), SampleDatePOJO.class);
System.out.println(sampleDatePOJO.getEventDate()); //this gives output "Tue
Jun 27 10:43:59 IST 2017"
注意:如果我删除mapper.setDateFormat(..)并在“eventDate”字段上使用@JsonFormat(pattern=“yyyy-MM-dd HH:MM:ss.ssssss x”,timezone=“IST”),它将给出相同的输出
自定义反序列化程序的Java代码
public class CustomDateDeserializer extends JsonDeserializer<Date>{
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSXXX");
Date dateTmp = null;
try {
dateTmp = sdf.parse(p.getValueAsString());
} catch (ParseException e) {
e.printStackTrace();
}
return dateTmp;
}
}
收到的输出为:
System.out.println(sampleDatePOJO.getEventDate())//“2017年6月27日星期二10:13:59 IST”
这是正确的,因为毫秒“573503”部分添加到日期
我需要理解为什么我的setDateFormat和@JsonFormat不起作用。或者,如果它们工作正常,为什么相同格式的输出会有差异。
非常感谢您的帮助。您是否注意到,在前两次转换中,您使用的是日期模式中的单个
X
(yyyy-MM-dd HH:MM:ss.ssssss X)
。
但是在定制的序列化程序中,您使用的是正确的XXX
(yyyy-MM-dd-HH:MM:ss.ssssss-XXX)
这种模式差异实际上导致了所有差异(30分钟的差异)。如果在不同的机制中使用相同的模式,那么输出也将保持不变。但为什么要将573503视为毫秒?他们不是打算从另一端算起微秒(百万分之一秒)吗?相关:。请看:如果模式为“X”,时区为“GMT+05:30”,则生成“+05”。由于只有一个
X
,偏移量中的30分钟将被忽略,SimpleDateFormat
会把一切都搞糟。同样,作为@OleV.V。在上面的评论中说,你确定你真的想考虑573503毫秒,并把它添加到日期吗?这听起来不是更正确的方法,因为小数点后的所有内容都应该被视为秒的分数。
@JsonDeserialize(using=CustomDateDeserializer.class)