I’m trying to have a custom date format in Gson output, but .setDateFormat(DateFormat.FULL)
doesn’t seem to work and it the same with .registerTypeAdapter(Date.class, new DateSerializer())
.
It’s like Gson doesn’t care about the object “Date” and print it in its way.
How can I change that?
Thanks
EDIT:
@Entity public class AdviceSheet { public Date lastModif; [...] } public void method { Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create(); System.out.println(gson.toJson(adviceSheet); }
I always use java.util.Date
; setDateFormat()
doesn’t work 🙁
Advertisement
Answer
It seems that you need to define formats for both date and time part or use String-based formatting. For example:
Gson gson = new GsonBuilder() .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
Gson gson = new GsonBuilder() .setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
or do it with serializers:
I believe that formatters cannot produce timestamps, but this serializer/deserializer-pair seems to work
JsonSerializer<Date> ser = new JsonSerializer<Date>() { @Override public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) { return src == null ? null : new JsonPrimitive(src.getTime()); } }; JsonDeserializer<Date> deser = new JsonDeserializer<Date>() { @Override public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { return json == null ? null : new Date(json.getAsLong()); } }; Gson gson = new GsonBuilder() .registerTypeAdapter(Date.class, ser) .registerTypeAdapter(Date.class, deser).create();
If using Java 8 or above you should use the above serializers/deserializers like so:
JsonSerializer<Date> ser = (src, typeOfSrc, context) -> src == null ? null : new JsonPrimitive(src.getTime()); JsonDeserializer<Date> deser = (jSon, typeOfT, context) -> jSon == null ? null : new Date(jSon.getAsLong());