2010-12-01 7 views
5

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

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

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

ответ

6

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

Я создал небольшой пример ниже, в котором 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

Это не отвечает на вопрос, не так ли? В вопросе четко указаны «даты в формате времени» – Nilzor 2013-03-06 15:21:01

1

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

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