2017-08-28 217 views
-1

我想一个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格式。 任何帮助,不胜感激。

+1

但是为什么你想把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)。 –

+1

看看['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

回答

2

你有没有注意到,在头两个转换要在日期模式采用单X(yyyy-MM-dd HH:mm:ss.SSSSSSX)。 但是在定制去污剂中,您使用的是正确的XXX(yyyy-MM-dd HH:mm:ss.SSSSSSXXX)

该图案差实际上是导致所有的差(30分钟的差)。如果你在不同的机制中使用相同的模式,那么输出也会保持不变。

相关问题