2015-06-04 123 views
1

我有一個Contact類,其中包含一個created Date屬性。我試圖做到以下幾點:GSON DateTypeException以毫秒爲單位輸入日期時輸入

Contact received = gson.fromJson(contactJson, Contact.class); 

但是我得到異常:

com.google.gson.JsonSyntaxException: 1433444958703 
at com.google.gson.internal.bind.DateTypeAdapter.deserializeToDate(DateTypeAdapter.java:81) 
at com.google.gson.internal.bind.DateTypeAdapter.read(DateTypeAdapter.java:66) 

有一個類似的解決方案,這已經發布: "Unparseable date: 1302828677828" trying to deserialize with Gson a millisecond-format date received from server

但是它不工作對我來說(不會編譯)。

Gson版本2.3.1

想法?

TIA, - 奧萊

回答

1

在這裏找到一個類似的解決方案(Gson: JsonSyntaxException on date),和調整稍微:

class JsonDateDeserializer 
    implements JsonDeserializer<Date> { 

    public Date deserialize(JsonElement json, 
          Type date, 
          JsonDeserializationContext context) 
     throws JsonParseException { 
     String stringDate = json.getAsJsonPrimitive().getAsString(); 
     return new Date(Long.parseLong(stringDate)); 
    } 
} 

Gson gson = 
    new GsonBuilder().registerTypeAdapter(Date.class, 
              new JsonDateDeserializer()) 
     .create(); 

這工作。如果這是GSON中的默認設置,那將會很棒:)。

0

您可以編寫一個簡單的類型適配器,並使用GsonBuilder實例註冊它,或使用@JsonAdapter在Contact類本身進行註釋。請注意,您應該將日期序列化爲長字符串,因爲long不是有效的JSON類型,並且可能會被修剪爲整數(對於大多數日期而言,這肯定會失敗)。

這裏是適配器將如何看起來像: https://github.com/google-gson/typeadapters/blob/master/common/src/main/java/LongDateTypeAdapter.java

下面是說明如何使用它的測試: https://github.com/google-gson/typeadapters/blob/master/common/src/test/java/LongDateTypeAdapterTest.java

+0

您好

public class LongDateTypeAdapter extends TypeAdapter<Date> { @Override public void write(JsonWriter out, Date value) throws IOException { if (value == null) { out.nullValue(); } else { out.value(String.valueOf(value.getTime())); } } @Override public Date read(JsonReader in) throws IOException { switch (in.peek()) { case NULL: return null; case STRING: try { return new Date(Long.parseLong(in.nextString())); } catch (NumberFormatException e) { throw new JsonSyntaxException(e); } default: throw new JsonSyntaxException("invalid date" + in.getPath()); } } } 

你可以看到源代碼@ inder123 感謝您指出替代解決方案。我們能否爲構建器添加一個簡單選項來進行用於搜索的選項,以指定Spring Boot在異常中列出的三種標準表單之一? (\「yyyy-MM-dd'T'HH:mm:ss.SSSZ \」 \「yyyy-MM-dd'T'HH:mm:ss.SSS'Z'\」 \「EEE, dd MMM yyyy HH:mm:ss zzz \「 \」yyyy-MM-dd \「)) 另外,如果GSON具有更加智能的反序列化,這反映了Spring Boot編組的特性,並且可能包含其他格式框架也是如此。 – Ole

+0

@ user1684269您應該使用GsonBuilder.setDateFormat()和您選擇的模式。 – inder

相關問題