2010-12-01 19 views
5

En nuestro servidor REST configurado para Spring usamos Jackson para convertir un objeto en Json. Este objeto contiene varios objetos java.util.Date.Cómo convertir una fecha entre Jackson y Gson?

Cuando intentamos deserializarlo en un dispositivo Android utilizando el método de Json de Gson, obtenemos una "java.text.ParseException: fecha imposible de escanear". Hemos intentado serializar la fecha en una marca de tiempo correspondiente a milisegundos desde 1970, pero obtenemos la misma excepción.

¿Se puede configurar Can Gson para analizar una fecha con formato de fecha y hora como 1291158000000 en un objeto java.util.Date?

Respuesta

6

Debe registrar su propio deserializador para Fechas.

He creado un pequeño ejemplo de abajo, en el que la cadena JSON "23-11-2010 10:00:00" deserializar a un objeto Date:

import java.lang.reflect.Type; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.JsonDeserializationContext; 
import com.google.gson.JsonDeserializer; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonParseException; 


public class Dummy { 
    private Date date; 

    /** 
    * @param date the date to set 
    */ 
    public void setDate(Date date) { 
     this.date = date; 
    } 

    /** 
    * @return the date 
    */ 
    public Date getDate() { 
     return date; 
    } 

    public static void main(String[] args) { 
     GsonBuilder builder = new GsonBuilder(); 
     builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 

      @Override 
      public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
        throws JsonParseException { 

       SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
       String date = json.getAsJsonPrimitive().getAsString(); 
       try { 
        return format.parse(date); 
       } catch (ParseException e) { 
        throw new RuntimeException(e); 
       } 
      } 
     }); 
     Gson gson = builder.create(); 
     String s = "{\"date\":\"23-11-2010 10:00:00\"}"; 
     Dummy d = gson.fromJson(s, Dummy.class); 
     System.out.println(d.getDate()); 
    } 
} 
+1

Esto realmente no responde la pregunta, ¿o sí? La pregunta indica claramente "fechas con formato de fecha y hora" – Nilzor

1

En lo que respecta a Jackson que, no solo puede elegir entre la serialización numérica (marca de tiempo) y textual (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS), sino que también define el DateFormat exacto a usar para la variante textual (SerializationConfig.setDateFormat). Por lo tanto, debería poder forzar el uso de algo que Gson reconoce, si no es compatible con el formato ISO-8601 que Jackson utiliza de manera predeterminada.

También: Jackson funciona bien en Android, si no te importa usarlo a través de Gson.

Cuestiones relacionadas