Domanda

Nel nostro REST server Primavera-configurato usiamo Jackson per convertire un oggetto in JSON. Questo oggetto contiene diversi oggetti java.util.Date.

Quando tentiamo di deserializzare su un dispositivo Android con il metodo del fromJson GSON otteniamo un "java.text.ParseException: Data di analizzarlo". Abbiamo provato serializzazione data ad una data corrispondente a millisecondi dal 1970, ma ottenere la stessa eccezione.

Can GSON essere configurato per analizzare una data timestamp formattato come ad esempio 1.291.158 milioni in un oggetto java.util.Date?

È stato utile?

Soluzione

È necessario registrare il proprio deserializzatore per le date.

Ho creato un piccolo esempio di seguito, in cui la stringa JSON "23-11-2010 10:00:00" viene deserializzato un oggetto 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());
    }
}

Altri suggerimenti

Per quanto riguarda la Jackson, è possibile non solo scegliere tra numerica (timestamp) e la serializzazione testuali (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS), ma anche definire DateFormat esatto da utilizzare per la variante testuale (SerializationConfig.setDateFormat). Così si dovrebbe essere in grado di forzare l'uso di qualcosa GSON riconosce, se non supporta ISO-8601 Jackson default ad usare.

Inoltre:. Jackson funziona bene su Android, se non ti dispiace utilizzando sopra GSON

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top