我想一个JSON目前在文件中,转换成使用ObjectMapper的Java对象。不同的输出使用ObjectMapper“setDateFormat”和自定义日期解串器使用@JsonDeserialize
JSON文件:采样日期str.json
{
"eventDate"="2017-06-27 10:04:26.573503+05:30"
}
爪哇POJO: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(..)并使用@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss.SSSSSSX”,timezone =“IST”)在'eventDate'字段给出相同的输出。
Java代码定制Deserilaizer
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;
}
}
如果我使用上面的 'EVENTDATE' 字段@JsonDeserialize注解注释为:
@JsonDeserialize(using=CustomDateDeserializer.class)
收到输出:
System.out.println(sampleDatePOJO.getEventDate()); //"Tue Jun 27 10:13:59 IST 2017"
这是毫秒“573503”部分添加到日期是正确的。
我需要了解为什么我的ObjectMapper setDateFormat和@JsonFormat是行不通的。或者如果他们工作的很好,为什么在输出格式上有相同的SimpeDateFormat格式。 任何帮助,不胜感激。
但是为什么你想把573503看作毫秒?他们不是打算从另一端的微秒(百万分之几秒)吗?相关:[java.text.ParseException:不可解析日期:YYYY-MM-DD HH:MM:SS.SSSSSS](https://stackoverflow.com/questions/8607809/java-text-parseexception-unparseable-date-yyyy- MM-DD-HHMMSS-SSSSSS)。 –
看看['SimpleDateFormat'的Javadoc](https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html#iso8601timezone):**如果该图案是 “X”并且时区为“GMT + 05:30”,则生成“+05”**。只有一个'X',偏移量中的30分钟被忽略,'SimpleDateFormat'将所有东西混淆。还有,@ OleV.V。在上面的评论中说,你确定你真的想把573503看作毫秒并将其添加到日期吗?这听起来不是更正确的方法,因为小数点后面的所有内容都应该被认为是秒的小数部分。 – 2017-08-28 12:14:09