2013-02-21 7 views
30

GSONを使用して、いくつかのオブジェクトグラフをJSONにシリアライズしています。これらのオブジェクトグラフは、Joda Timeエンティティ(DateTime,LocalTimeなど)を使用しています。GSON Joda Timeシリアライザの標準実装はありますか?

トップ、Googleが "gsonジョダ" のヒットはこのページです:

それはorg.joda.time.DateTimeのタイプのアダプターのためのソースを提供します。このリンクは、GSON User Guideで参照されているものです。

私はMavenの依存関係として参照できるjoda-timeシリアライザを含む事前ローリングライブラリを見つけることが期待されますが、見つけられません。

1つはありますか?それとも私は自分のプロジェクトでそのスニペットを複製する必要がありますか?

答えて

30

私のプロジェクトの次の使用しています - あなたはここでそれを見つけることができます:

https://github.com/gkopff/gson-jodatime-serialisers

ここでMavenの詳細です(中央をチェック最新バージョンの場合):

<dependency> 
    <groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId> 
    <artifactId>gson-jodatime-serialisers</artifactId> 
    <version>1.6.0</version> 
</dependency> 

次に、ドライブの簡単な例を示します。

Gson gson = Converters.registerDateTime(new GsonBuilder()).create(); 
SomeContainerObject original = new SomeContainerObject(new DateTime()); 

String json = gson.toJson(original); 
SomeContainerObject reconstituted = gson.fromJson(json, SomeContainerObject.class); 
+3

Java 8の 'java.time'クラスもあります:https://github.com/gkopff/gson-javatime-serialisers –

+0

ライフセーバー!ありがとうございました。 –

+0

@GregKopffは公式図書館の著者と話をしてくれてありがとう。あなたのライブラリには 'PeriodConverter'がありません。私は1つを実装しようとしましたが、失敗します。 (私はあまり理解していないので、あなたのコードに基づいています)。ここで私の質問:http:// stackoverflow.com/questions/33219587/gson-jodatime-serialisers-library-implementation-periodconverter-for-period-in-joda'訪問してコメントをください。ありがとう:) – hqt

1

あなたはこの種のライブラリを利用できないと私はかなり正常に思えます。

一見するとシンプルに見えるかもしれませんが、多くの依存関係(コンパイル時には実行中のもの、実行時のものもあります)が発生し、作成しないことを確認するのは簡単ではありません不要な依存関係。

これはランタイムの依存性だと思うので、これは大丈夫です(JODAが使用されていない場合、serializerLibを使用するプロジェクトではJODAライブラリは必要ありません)。しかし、他の場合には、これは醜くなる可能性があります。

+1

さまざまなJoda TimeエンティティにGSONシリアライザを提供する 'gson-jodatime-converter'ライブラリが好きでした。これには逃げる依存関係はありません。GSON(私は既に使っています)とJoda Time(私はすでに使っています)の2つしかありません。 –

+0

私は、多くの依存関係を終わらせますが、非常にモジュラーなアプローチで終わります。これはうまくいくだろうが、誰もがクラスの小さな集団のためのオープンソースプロジェクトを維持することが理にかなっていると思っていないので、存在しないと思う。 –

+0

*私は*その少数のクラスを維持することを決めたMaven Centralへの結果)。参照:http://stackoverflow.com/a/22554290/1212960 –

0

スニペットを複製すると、多くの人が異なる日付文字列の書式設定を使用し、ライブラリ作成を混乱させます。

+0

パッケージはISO 8601を使用するのが簡単です。他のものと相互運用可能である必要はありません(最初のインスタンスで)。データ自体をラウンドトリップできるようにします。 –

+0

はい、これはあなたの必要性(そして私のもの)ですが、いくつかのプロジェクトでJSONを使用して異種環境と通信しています(このためにSOAPを使用し、WSDLを使って自己文書化しています) "標準になる –

13

私は、私は私自身のオープンソース1をロールバックすることを決定した

public final class DateTimeDeserializer implements JsonDeserializer<DateTime>, JsonSerializer<DateTime> 
{ 
    static final org.joda.time.format.DateTimeFormatter DATE_TIME_FORMATTER = 
     ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); 

    @Override 
    public DateTime deserialize(final JsonElement je, final Type type, 
          final JsonDeserializationContext jdc) throws JsonParseException 
    { 
     return je.getAsString().length() == 0 ? null : DATE_TIME_FORMATTER.parseDateTime(dateAsString); 
    } 

    @Override 
    public JsonElement serialize(final DateTime src, final Type typeOfSrc, 
           final JsonSerializationContext context) 
    { 
     return new JsonPrimitive(src == null ? StringUtils.EMPTY :DATE_TIME_FORMATTER.print(src)); 
    } 
} 
+0

こんにちは、輸入品を提供してください。私は約20のタイプクラスを見つける – MartinL

+0

@MartinL 'GSON' lib(https://code.google.com/p/google-gson/)が使われています。 'Type'はjava-reflection APIからのクラスです:' java.lang.reflect.Type' – Ilya

+0

これを私のdatetimeデシリアライザに追加しようとしましたが、私のアプリはまだクラッシュしました.... datetimeオブジェクトを読み取ることができないために 何をする? –

10

ジョダ事前設定フォーマッタの使用をラップするGSONとTypeAdapterを登録し、私はモデルのシリアライズとデシリアライズの両方を処理する小さなヘルパーを行うために上記の解答を使用http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html

import java.lang.reflect.Type; 
import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonPrimitive; 
import com.google.gson.JsonSerializationContext; 
import com.google.gson.JsonSerializer; 
import java.lang.reflect.Type; 
import org.joda.time.DateTime; 
import org.joda.time.format.ISODateTimeFormat; 

public class JodaDateTimeWithGson { 

    public static void main(String[] args) { 
     Gson gson = new GsonBuilder() 
      .registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>(){ 
       @Override 
       public JsonElement serialize(DateTime json, Type typeOfSrc, JsonSerializationContext context) { 
        return new JsonPrimitive(ISODateTimeFormat.dateTime().print(json)); 
       } 
      }) 
      .create() 
      ; 

     // Outputs ["20160222T15:58:33.218Z",42,"String"] 
     System.out.println(gson.toJson(new Object[] {DateTime.now(), 42, "String"})); 
    } 
} 
+0

恐ろしい、私のために完全に働いた...ありがとう (いくつかの変数としてDateTimeを持つオブジェクトでも動作します) –

2

見ますDateTime変数を含むオブジェクト

public static Gson gsonDateTime() { 
    Gson gson = new GsonBuilder() 
      .registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>() { 
       @Override 
       public JsonElement serialize(DateTime json, Type typeOfSrc, JsonSerializationContext context) { 
        return new JsonPrimitive(ISODateTimeFormat.dateTime().print(json)); 
       } 
      }) 
      .registerTypeAdapter(DateTime.class, new JsonDeserializer<DateTime>() { 
       @Override 
       public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
        DateTime dt = ISODateTimeFormat.dateTime().parseDateTime(json.getAsString()); 
        return dt; 
       } 
      }) 
      .create(); 
    return gson; 
} 
関連する問題