GSON - Formato de fecha
Estoy intentando tener un formato de fecha personalizado en la salida de Gson, pero .setDateFormat(DateFormat.FULL)
no parece funcionar y ocurre lo mismo con .registerTypeAdapter(Date.class, new DateSerializer())
.
Es como si a Gson no le importara el objeto "Fecha" y lo imprimiera a su manera.
¿Cómo puedo cambiar eso?
Gracias
EDITAR:
@Entity
public class AdviceSheet {
public Date lastModif;
[...]
}
public void method {
Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create();
System.out.println(gson.toJson(adviceSheet);
}
Yo siempre uso java.util.Date
; setDateFormat()
no funciona :(
Parece que necesita definir formatos tanto para la fecha como para la hora o utilizar el formato basado en cadenas. Por ejemplo:
Gson gson = new GsonBuilder()
.setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
o usando java.text.DateFormat
Gson gson = new GsonBuilder()
.setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
o hacerlo con serializadores:
Creo que los formateadores no pueden producir marcas de tiempo, pero este par serializador/deserializador parece funcionar
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();
Si usa Java 8 o superior, debe usar los serializadores/deserializadores anteriores de esta manera:
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();
El formato anterior me parece mejor ya que tiene una precisión de hasta milis.
Como señaló ML, JsonSerializer funciona aquí. Sin embargo, si está formateando entidades de base de datos, use java.sql.Date para registrar su serializador. No se necesita deserializador.
Gson gson = new GsonBuilder()
.registerTypeAdapter(java.sql.Date.class, ser).create();
Este informe de error puede estar relacionado: http://code.google.com/p/google-gson/issues/detail?id=230 . Aunque uso la versión 1.7.2.
En caso de que odies las clases internas, aprovechando la interfaz funcional puedes escribir menos código en Java 8 con una expresión lambda.
JsonDeserializer<Date> dateJsonDeserializer =
(json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong());
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();