GSON - Formato de fecha

Resuelto Stéphane Piette asked hace 13 años • 8 respuestas

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 :(

Stéphane Piette avatar Jul 29 '11 19:07 Stéphane Piette
Aceptado

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());
M.L. avatar Jul 29 '2011 15:07 M.L.
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.

tj-recess avatar Oct 29 '2014 13:10 tj-recess

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.

Milanka avatar Nov 22 '2012 08:11 Milanka

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();
Karthik avatar Feb 24 '2016 20:02 Karthik