2014-02-09 111 views
6

使用Google GSON lib來處理序列化/反序列化,消耗客戶端的JSON API。 這被證明是有問題的,因爲在API的json實體中有很多關於API的日期格式。是使用GSON反序列化兩種不同的日期格式

的一些例子如下...

「2014年2月9日」

「15/10/1976」

「2014-02-09T07:32:41 +00:00「

我無法控制API,因爲它由客戶端開發並且已被其他方使用。 似乎我可以設置GSON使用單一的日期格式,但我不能得到它解析每場的基礎上的日期。

我本來期待GOSN爲此提供一個註釋,但我似乎找不到一個。 任何想法設置這個人嗎?

+1

請注意,JSON沒有定義標準的日期格式。日期可以是任何字符格式,也可以是自某個時間點以來的秒或毫秒 - 完全取決於發件人。 –

回答

6

由於您在POJO中有多個Date字段,並且包含JSON的日期格式不同,所以您需要爲Date編寫一個可以處理這些格式的自定義解串器。

class DateDeserializer implements JsonDeserializer<Date> 
{ 
    @Override 
    public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException 
    { 
     String myDate = je.getAsString(); 
     // inspect string using regexes 
     // convert string to Date   
     // return Date object 
    } 

} 

創建GSON實例時,您可以將其註冊爲一個類型的適配器:

Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Date.class, new DateDeserializer()) 
       .create(); 

你可以,當然,也只寫你的POJO自定義解串器和自己從填充一切解析樹。

另一種選擇是在POJO中簡單地將它們設置爲String,然後讓每個字段的獲得者將它們轉換爲Date

除此之外,如果您沒有完全使用Gson,那麼Jackson JSON解析器(默認情況下)會在反序列化過程中使用POJO的setter,這會讓您明確控制設置每個字段。

+0

由於GSON的侷限性,不是理想的選擇。謝謝(你的)信息。 –

+0

@ carrot_programmer_3另一種選擇是爲具有多種日期格式的類編寫自定義反序列化器。雖然這可能有點乏味,但它會解決問題。 –