38

GSONを使用して、いくつかのオブジェクトグラフをJSONにシリアル化します。これらのオブジェクトグラフは、Joda Timeエンティティ(など)を使用します。DateTimeLocalTime

「gsonjoda」のトップGoogleヒットはこのページです:

のタイプアダプタのソースを提供しますorg.joda.time.DateTime。このリンクは、GSONユーザーガイドで参照されているものでもあります。

Mavenの依存関係として参照できるjoda-timeシリアライザーを含むプレロールライブラリを見つけることを期待していましたが、見つかりません。

ありますか?または、自分のプロジェクトでそのスニペットを複製する必要がありますか?

4

6 に答える 6

42

私は自分自身のオープンソースのものを展開することにしました - あなたはここでそれを見つけることができます:

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);
于 2014-03-21T09:02:14.570 に答える
14

プロジェクトで次を使用しています

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)); 
   }
}
于 2013-02-21T10:21:54.927 に答える
12

TypeAdapter を GSON に登録して、Joda の事前構成済みフォーマッタの使用をラップします。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"}));
    }
}
于 2016-02-22T16:03:35.343 に答える
0

この種のライブラリが利用できないのは、ごく普通のことのように思えます。

一見単純に見えるかもしれませんが、多くの依存関係 (コンパイル時、実行時) が発生するリスクがあり、不要な依存関係を作成しないようにするのは簡単ではありません。

あなたの場合、これは実行時の依存関係にすぎないと思うので、これで問題ありません(JODAが使用されていない場合、serializerLibを使用するプロジェクトにはJODA libは必要ありません)。しかし、他のケースでは、これは醜いものになる可能性があります。

于 2013-02-21T09:13:52.160 に答える
0

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

于 2013-02-21T09:16:02.707 に答える