2017-08-28 18 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分鐘的差)。如果你在不同的機制中使用相同的模式,那麼輸出也會保持不變。

相關問題