GSON - Date format GSON - Date format java java

GSON - Date format


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();

or using java.text.DateFormat

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());


Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();

Above format seems better to me as it has precision up to millis.


As M.L. pointed out, JsonSerializer works here. However, if you are formatting database entities, use java.sql.Date to register you serializer. Deserializer is not needed.

Gson gson = new GsonBuilder()   .registerTypeAdapter(java.sql.Date.class, ser).create();

This bug report might be related: http://code.google.com/p/google-gson/issues/detail?id=230. I use version 1.7.2 though.