Как сериализовать Date в long с помощью gson?
Недавно я переключил часть нашей сериализации с Jackson
на Gson
. Выяснилось, что Джексон сериализует даты с длинными.
Но, по умолчанию Gson сериализует даты в строках.
Как мне сериализовать даты в longs при использовании Gson? Спасибо.
Ответы
Ответ 1
Адаптер первого типа выполняет десериализацию, а второй - сериализацию.
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);
Ответ 2
Вы можете сделать оба направления с одним типом адаптера:
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();