2016-12-27 306 views
4

我正在使用Gson序列化/反序列化我的pojos,並且當前正在尋找一種乾淨的方式告訴Gson將unix-timestamps解析/輸出日期屬性。 這裏是我的嘗試:Gson dateformat解析/輸出unix時間戳

Gson gson = new GsonBuilder().setDateFormat("U").create(); 

從PHP正在添加,其中「U」是用來解析日期格式/輸出日期爲UNIX的時間戳,運行我嘗試代碼時,我得到這個RuntimeException的:

未知圖形字符「U」

我假設GSON使用的SimpleDateFormat不定義字母「U」的引擎蓋下。

我可以寫一個DateTypeAdapter並在GsonBuilder中註冊,但我正在尋找一種更乾淨的方法來實現這一目標。只需更改DateFormat就會很棒。

回答

7

創建自定義DateTypeAdapter是要走的路。

MyDateTypeAdapter

public class MyDateTypeAdapter extends TypeAdapter<Date> { 
    @Override 
    public void write(JsonWriter out, Date value) throws IOException { 
     if (value == null) 
      out.nullValue(); 
     else 
      out.value(value.getTime()/1000); 
    } 

    @Override 
    public Date read(JsonReader in) throws IOException { 
     if (in != null) 
      return new Date(in.nextLong() * 1000); 
     else 
      return null; 
    } 
} 

不要忘記註冊它

Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,new MyDateTypeAdapter()).create(); 
+1

嗨,你的回答可以在https://github.com/google/gson/issues/987解決你的問題,因爲ypu有你自己的解決方案,它是以真正的Gson方式實現的(不是解決方法,這是設計)。 :)請問你能解決這個問題嗎?謝謝! –

+0

@LyubomyrShaydariv Thanx提醒我。您的請求已完成。 (你是對的先生,這就是Gson設計的方式) – AnixPasBesoin

+1

啊,還有一點需要注意:'JsonReader.toString'返回一個人類可讀的當前'JsonReader'狀態,比如'JsonReader在1行1列路徑$'。有可能是一個錯字,並且'in.nextString()'真的在你的代碼中做了你所需要的。甚至更短:'新日期(in.nextLong()/ 1000)'。 –

0

時間戳只是long的,所以你可以在你的POJO中使用它。如果該字段丟失,或使用Long獲得null

class myPOJO { 
    Long myDate; 
} 
+0

是不是有什麼其他辦法讓別人的屬性的日期?這似乎是我正在處理的問題的解決方案。 – AnixPasBesoin