Question

Dans notre REST-serveur configuré Spring nous utilisons Jackson pour convertir un objet en JSON. Cet objet contient plusieurs objets java.util.Date.

Quand nous essayons de désérialiser sur un appareil Android en utilisant la méthode fromJson de Gson nous obtenons un « java.text.ParseException: Date Unparseable ». Nous avons essayé sérialisation la date à un horodatage correspondant aux millisecondes depuis 1970, mais obtenir la même exception.

peut Gson être configuré pour analyser une date au format horodatage tel que 1291158000000 dans un objet java.util.Date?

Était-ce utile?

La solution

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

Autres conseils

En ce qui concerne Jackson, vous pouvez non seulement choisir entre numérique (horodatage) et sérialisation textuelle (de 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 Gson reconnaît, si elle ne prend pas en charge par défaut le format ISO-8601 Jackson à utiliser.

Aussi:. Jackson fonctionne très bien sur Android, si vous ne me dérange pas l'utiliser sur Gson

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top