一部のオブジェクトグラフをJSONにシリアル化するためにGSONを使用しています。これらのオブジェクトグラフは Joda Time エンティティ(DateTime
、LocalTime
など)を使用します。
「gson joda」のGoogleヒットのトップは次のページです。
org.joda.time.DateTime
のタイプアダプタのソースを提供します。このリンクは GSONユーザーガイド でも参照されています。
Mavenの依存関係として参照できるjoda-timeシリアライザーを含むプレロールライブラリが見つかると思っていましたが、見つかりません。
ありますか?それとも私は自分のプロジェクトでそのスニペットを複製することを余儀なくされていますか?
私は自分のオープンソースを公開することにしました-ここで見つけることができます:
これが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);
私は自分のプロジェクトで次を使用しています
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));
}
}
上記の回答を使用して、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;
}
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"}));
}
}
この種のライブラリを利用できないのはごく普通のことです。
一見シンプルに見えるかもしれませんが、リスクは多くの依存関係(コンパイル時と実行時のいくつか)になり、不要な依存関係を作成しないようにするのは簡単ではないことです。
あなたの場合、これは大丈夫です。これは実行時の依存関係にすぎないと思います(JODAが使用されていない場合、serializerLibを使用するプロジェクトはJODA libを必要としません)。しかし、他のいくつかのケースでは、これは醜くなるかもしれません。
そのスニペットを複製すると、多くの人が異なる日付文字列フォーマットを使用するため、ライブラリの作成が混乱します。