setdateformat jsonsyntaxexception google formato fecha deserialize aaaa java gson

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

o usando java.text.DateFormat

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''