Estoy tratando de 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 si a Gson no le importara 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);
}
Yo siempre uso java.util.Date
; setDateFormat()
no funciona :(
Respuestas:
Parece que necesita definir formatos para la parte de fecha y hora o utilizar el formato basado en cadenas. Por ejemplo:
o usando java.text.DateFormat
o hacerlo con serializadores:
Creo que los formateadores no pueden producir marcas de tiempo, pero este par serializador / deserializador parece funcionar
Si usa Java 8 o superior, debe usar los serializadores / deserializadores anteriores de la siguiente manera:
fuente
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
funciona.Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();
funcionaEl formato anterior me parece mejor ya que tiene una precisión de hasta milis.
fuente
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. El deserializador no es necesario.
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.
fuente
En caso de que odie las clases internas, aprovechando la interfaz funcional puede escribir menos código en Java 8 con una expresión lambda.
fuente
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, (JsonDeserializer) (json, typeOfT, context) -> new Date(json.getAsLong())).create();
Esto realmente no funcionará en absoluto. No hay tipo de fecha en JSON. Recomendaría serializar a ISO8601 de un lado a otro (para agnósticos de formato y compatibilidad JS). Tenga en cuenta que debe saber qué campos contienen fechas.
fuente
Puede especificar su formato
Gson gson = builder.setDateFormat("yyyy-MM-dd").create();
en este método en lugar deyyyy-MM-dd
usar cualquier otro formatofuente
Se trata de un error . Actualmente, también debe establecer un
timeStyle
o utilizar una de las alternativas descritas en las otras respuestas.fuente
Estoy en Gson 2.8.6 y descubrí este error hoy.
Mi enfoque permite que todos nuestros clientes existentes (móvil / web / etc.) continúen funcionando como estaban, pero agrega un poco de manejo para aquellos que usan formatos de 24 horas y también permite millis, en buena medida.
Mantuve la serialización igual que todos los clientes entienden el formato estándar de fecha json.
Por lo general, no creo que sea una buena práctica usar bloques try / catch, pero este debería ser un caso bastante raro.
fuente