java - jsonsyntaxexception - retrofit gson date format
GSON-Formato de fecha (6)
Como ML señaló, JsonSerializer funciona aquí. Sin embargo, si está formateando entidades de base de datos, use java.sql.Date para registrar su serializador. Deserializer no es necesario.
Gson gson = new GsonBuilder()
.registerTypeAdapter(java.sql.Date.class, ser).create();
Este informe de error podría estar relacionado: http://code.google.com/p/google-gson/issues/detail?id=230 . Aunque uso la versión 1.7.2.
.setDateFormat(DateFormat.FULL)
tener un formato de fecha personalizado en la salida de Gson, pero .setDateFormat(DateFormat.FULL)
no parece funcionar y es lo mismo con .registerTypeAdapter(Date.class, new DateSerializer())
.
Es como que a Gson no le importa el objeto "Fecha" y lo imprime 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);
}
Siempre uso java.util.Date
; setDateFormat()
no funciona :(
En caso de que odies las clases internas, aprovechando la ventaja de 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();
Esto realmente no funcionará en absoluto. No hay tipo de fecha en JSON. Recomendaría serializar a ISO8601 de ida y vuelta (para agnósticos de formato y compat. JS). Considere que debe saber qué campos contienen fechas.
Parece que necesita definir formatos para partes de fecha y hora o usar el formato basado en cadenas. Por ejemplo:
Gson gson = new GsonBuilder()
.setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create();
Gson gson = new GsonBuilder()
.setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
o hazlo con serializadores:
Creo que los formateadores no pueden producir marcas de tiempo, pero este serializador / par 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();
Puede especificar que formatee Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
en este método en lugar de yyyy-MM-dd
puedes usar cualquier otro formato
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
}
});
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd''T''HH:mm:ss.SSS''Z''").create();
El formato anterior me parece mejor ya que tiene una precisión de hasta milis.
Editado el formato para citar ''Z''