2011-07-29 36 views
137

我試圖在Gson輸出中使用自定義日期格式,但.setDateFormat(DateFormat.FULL)似乎不起作用,它與.registerTypeAdapter(Date.class, new DateSerializer())一樣。GSON - 日期格式

這就像Gson不關心對象「日期」並打印它的方式。

我該如何改變這種情況?

感謝

編輯:

@Entity 
public class AdviceSheet { 
    public Date lastModif; 
[...] 
} 

public void method { 
    Gson gson = new GsonBuilder().setDateFormat(DateFormat.LONG).create(); 
    System.out.println(gson.toJson(adviceSheet); 
} 

我總是用java.util.Date; setDateFormat()不工作:(

+0

您是否檢查過您是否在所有地方導入了正確的Date類?此外,代碼示例會很有幫助。 –

+0

你的意思是什麼不起作用?你真正看到了什麼? –

回答

238

看來你需要定義日期和時間格式的一部分,或者使用基於字符串的格式,例如:

Gson gson = new GsonBuilder() 
    .setDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz").create(); 

using java.text.DateFormat

Gson gson = new GsonBuilder() 
    .setDateFormat(DateFormat.FULL, DateFormat.FULL).create(); 

或使用序列化程序:

我相信格式化程序不能產生時間戳,但是此串行器/解串器對似乎工作在

JsonSerializer<Date> ser = new JsonSerializer<Date>() { 
    @Override 
    public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext 
      context) { 
    return src == null ? null : new JsonPrimitive(src.getTime()); 
    } 
}; 

JsonDeserializer<Date> deser = new JsonDeserializer<Date>() { 
    @Override 
    public Date deserialize(JsonElement json, Type typeOfT, 
     JsonDeserializationContext context) throws JsonParseException { 
    return json == null ? null : new Date(json.getAsLong()); 
    } 
}; 

Gson gson = new GsonBuilder() 
    .registerTypeAdapter(Date.class, ser) 
    .registerTypeAdapter(Date.class, deser).create(); 
+0

好吧,它用你的方式更好地工作。 但我怎樣才能顯示這個時間戳? –

+0

我編輯了答案。也許它現在效果更好。 –

+0

@ M.L。非常好的答案! – Abubakkar

-2

這根本不會起作用。 JSON中沒有日期類型。我會推薦序列化到ISO8601來回(格式不可知論者和JS compat)。考慮你必須知道哪些字段包含日期。

3

As M.L.指出,JsonSerializer在這裏工作。但是,如果要格式化數據庫實體,請使用java.sql.Date註冊您的序列化程序。解串器不是必需的。

Gson gson = new GsonBuilder() 
    .registerTypeAdapter(java.sql.Date.class, ser).create(); 

這個錯誤報告可能是相關的:http://code.google.com/p/google-gson/issues/detail?id=230。但我使用1.7.2版本。

50
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").create(); 

以上格式對我來說似乎更好,因爲它具有精度高達millis。

編輯格式引用「Z」

+1

@Abhi - 爲什麼需要引用'Z'? –

+1

我嘗試過不引號和gson引發異常這個日期是不可解析的嗎? – Abhi

+2

我認爲這是更好的解決方案,應該標記爲答案 –

0

您可以指定在這個方法格式化Gson gson = builder.setDateFormat("yyyy-MM-dd").create();而不是yyyy-MM-dd你可以使用任何其它格式

GsonBuilder builder = new GsonBuilder(); 
         builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() { 
          public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
           return new Date(json.getAsJsonPrimitive().getAsLong()); 
          } 
         }); 

         Gson gson = builder.setDateFormat("yyyy-MM-dd").create(); 
2

在情況下,如果你不喜歡內部類,通過採取功能接口的優點是,您可以使用lambda表達式在Java 8中編寫更少的代碼。

JsonDeserializer<Date> dateJsonDeserializer = 
    (json, typeOfT, context) -> json == null ? null : new Date(json.getAsLong()); 
Gson gson = new GsonBuilder().registerTypeAdapter(Date.class,dateJsonDeserializer).create();