web-dev-qa-db-ja.com

gsonを使用して日付をlongにシリアル化する方法は?

最近、シリアル化の一部をJacksonからGsonに切り替えました。ジャクソンが日付をlongsにシリアル化していることがわかりました。

しかし、Gsonはデフォルトで日付を文字列にシリアル化します。

Gsonを使用している場合、日付をlongにシリアル化するにはどうすればよいですか?ありがとう。

11

最初のタイプのアダプターは逆シリアル化を行い、2番目のタイプは直列化を行います。

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, (JsonDeserializer<Date>) (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong()))
        .registerTypeAdapter(Date.class, (JsonSerializer<Date>) (date, type, jsonSerializationContext) -> new JsonPrimitive(date.getTime()))
        .create();

使用法:

String jsonString = gson.toJson(objectWithDate1);
ClassWithDate objectWithDate2 = gson.fromJson(jsonString, ClassWithDate.class);
assert objectWithDate1.equals(objectWithDate2);
20

1つのタイプのアダプターで双方向を実行できます。

public class DateLongFormatTypeAdapter extends TypeAdapter<Date> {

    @Override
    public void write(JsonWriter out, Date value) throws IOException {
        if(value != null) out.value(value.getTime());
        else out.nullValue();
    }

    @Override
    public Date read(JsonReader in) throws IOException {
        return new Date(in.nextLong());
    }

}

Gsonビルダー:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateLongFormatTypeAdapter())
        .create();
10
Daniel Hári