2016-12-27 15 views
4

Gsonを使用して私のpojosをシリアル化/逆シリアル化し、Gsonに日付属性をunix-timestampとして構文解析/出力するように指示するクリーンな方法を探しています。 は、ここに私の試みです:Gsonの日付形式でunix-timestampsを解析/出力する

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

PHPから来て、「U」は、解析するために使用DATEFORMAT/UNIX-タイムスタンプとして出力日付で、私の試みのコードを実行しているとき、私はこれはRuntimeException取得しています:

不明なパターン文字 'U'

Gsonが文字「U」を定義していないフードでSimpleDateformatを使用していると仮定しています。

私は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

ああ、もう1つ注意してください。 'JsonReader.toString'は' JsonReader 'という行1の列1のパス$ 'のような人間が読める現在の' JsonReader'状態を返します。おそらくタイプミスがあり、 'in.nextString()'は実際にあなたのコードで必要なことをします。それとももっと短い: 'new Date(in.nextLong()/ 1000)'。 –

0

タイムスタンプはちょうどlongのものなので、あなたのPOJOで使うことができます。フィールドがない場合はnullになるにはLongを使用してください。

class myPOJO { 
    Long myDate; 
} 
+0

日付としての私の日付属性を維持するための他の方法はありませんか?これは、私が扱っている問題に対するハックな解決策であるようです。 – AnixPasBesoin

関連する問題