Как сериализовать 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();
Ответ 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();