Как конвертировать Дата между Джексоном и Гсоном? - PullRequest
5 голосов
/ 01 декабря 2010

На нашем REST-сервере, настроенном Spring, мы используем Джексона для преобразования объекта в Json. Этот объект содержит несколько объектов java.util.Date.

Когда мы пытаемся десериализовать его на устройстве Android с помощью метода fromJson Джона, мы получаем «java.text.ParseException: Unparseable date». Мы пытались сериализовать дату с отметкой времени, соответствующей миллисекундам с 1970 года, но получили то же исключение.

Можно ли настроить Gson для анализа даты в формате отметки времени, например 1291158000000, в объект java.util.Date?

Ответы [ 2 ]

6 голосов
/ 01 декабря 2010

Вам необходимо зарегистрировать свой собственный десериализатор для дат.

Ниже я создал небольшой пример, в котором строка JSON "23-11-2010 10:00:00" десериализована в объект 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 голос
/ 03 декабря 2010

Что касается Джексона, вы можете не только выбирать между числовой (временная метка) и текстовой сериализацией (SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS), но и определять точный DateFormat для использования в текстовом варианте (SerializationConfig.setDateFormat). Таким образом, вы должны иметь возможность принудительно использовать то, что распознает Gson, если оно не поддерживает формат ISO-8601, который по умолчанию использует Джексон.

Также: Джексон отлично работает на Android, если вы не против использовать его поверх Gson.

...