2010-12-01 48 views
5

Dans notre serveur REST configuré par Spring, nous utilisons Jackson pour convertir un objet en Json. Cet objet contient plusieurs objets java.util.Date. Lorsque nous essayons de le désérialiser sur un appareil Android à l'aide de la méthode de Gson fromJson, nous obtenons une "java.text.ParseException: date introuvable". Nous avons essayé de sérialiser la date à un horodateur correspondant à des millisecondes depuis 1970, mais obtenir la même exception.Comment convertir une date entre Jackson et Gson?

Can Gson peut-il être configuré pour analyser une date au format horodatée telle que 1291158000000 dans un objet java.util.Date?

Répondre

6

Vous devez enregistrer votre propre désérialiseur pour les dates.

J'ai créé un petit exemple ci-dessous, dans lequel la chaîne JSON « 23-11-2010 10:00:00 » est désérialisée à un objet 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

Cela ne répond pas vraiment à la question, n'est-ce pas? La question indique clairement "les dates au format timestamp" – Nilzor

1

En ce qui concerne Jackson, vous peut non seulement choisir entre la sérialisation numérique (timestamp) et la sérialisation textuelle (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS), mais aussi définir DateFormat exacte à utiliser pour la variante textuelle (SerializationConfig.setDateFormat). Donc, vous devriez être en mesure de forcer l'utilisation de quelque chose que Gson reconnaît, si elle ne prend pas en charge le format ISO-8601 Jackson utilise par défaut.

Aussi: Jackson fonctionne bien sur Android, si cela ne vous dérange pas de l'utiliser sur Gson.