
Enquanto desenvolvia um webservice que usava Gson para transformar objetos em Json como formato de às requisições de um aplicativo Android, tive a necessidade de modificar o formato em que ficará objetos da classe java.util.Date após a serialização no webservice e de modificar o formato esperado na deserialização no cliente. Modifiquei os formatos para “yyyy-MM-dd’T’HH:mm:ss” da seguinte forma:
Criei um classe que herde de JsonSerializer no webservice e uma classe que herde de JsonDeserializer no app Android.
public class DateDeserializer implements JsonDeserializer { | |
@Override | |
public Date deserialize(JsonElement element, Type arg1, JsonDeserializationContext arg2) throws JsonParseException { | |
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); | |
try { | |
return formatter.parse(element.getAsString()); | |
} catch (ParseException e) { | |
return null; | |
} | |
} | |
} |
public class DateSerializer implements JsonSerializer { | |
@Override | |
public JsonElement serialize(Date date, Type typeOfSrc, JsonSerializationContext context) { | |
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); | |
return context.serialize(formatter.format(date)); | |
} | |
} |
Por fim, em ambos os lados, ao invés de criar uma instância da classe com.google.gson.Gson na forma direta, através de construtor (new Gson()), eu fiz uso do com.google.gson.GsonBuilder , por onde eu informei o JsonDeserializer e o JsonSerializer, dependendo do lado do sistema, como configuração antes do build.
Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new DateSerializer()).create(); | |
Gson gson = gsonBuilder.registerTypeAdapter(Date.class, new DateDeserializer()).create(); |