2016-11-11 88 views
2

我有兩種來自服務器Json的日期格式。 yyyy-MM-dd'T'HH:mm:ss and yyyy-MM-dd是我的日期格式。Gson轉換爲具有兩種日期格式的Json不起作用

所以我試圖用下面的代碼將這個Json轉換成Gson

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

這些都是我的日期格式,

private static final String[] DATE_FORMATS = new String[] { 
      "yyyy-MM-dd'T'HH:mm:ss", 
      "yyyy-MM-dd" 
}; 

private class DateDeserializer implements JsonDeserializer<Date> { 

    @Override 
    public Date deserialize(JsonElement jsonElement, Type typeOF, 
           JsonDeserializationContext context) throws JsonParseException { 
      for (String format : DATE_FORMATS) { 
       try { 
        return new SimpleDateFormat(format, Locale.US).parse(jsonElement.getAsString()); 
       } catch (ParseException e) { 
       } 
      } 
      throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString() 
        + "\". Supported formats: " + Arrays.toString(DATE_FORMATS)); 
     }  

} 

更新

這是我Json對象,

{ 
    "idpatient": 56, 
    "diabetesType": null, 
    "language": null, 
    "customId": "CUS790", 
    "diabetesOther": null, 
    "firstName": "Niro", 
    "lastName": "Wije", 
    "email": "[email protected]", 
    "dob": "1989-10-11", 
    "parentEmail": null, 
    "gender": "male", 
    "diagnosedDate": "2016-11-11", 
    "height": 0, 
    "weight": 0, 
    "heightUnit": null, 
    "weightUnit": null, 
    "theme": "Lite", 
    "userName": "weera", 
    "password": "asdf9999", 
    "dateCreated": 1478880594000, 
    "lastUpdated": 1478880594000 
} 

然後我試圖轉換一個JSON對象來GSON通過使用這個對象。我有以下錯誤日誌。

11-11 16:11:17.735 28072-28072/my.api.example W/System.err: com.google.gson.JsonParseException: Unparseable date: "1478880594000". Supported formats: [yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd] 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at my.api.example.activities.LoginActivity$DateDeserializer.deserialize(LoginActivity.java:180) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at my.api.example.activities.LoginActivity$DateDeserializer.deserialize(LoginActivity.java:168) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.google.gson.TreeTypeAdapter.read(TreeTypeAdapter.java:58) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:103) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:196) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.google.gson.Gson.fromJson(Gson.java:810) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.google.gson.Gson.fromJson(Gson.java:775) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:36) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at retrofit.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:24) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:148) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at retrofit.OkHttpCall.access$100(OkHttpCall.java:29) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at retrofit.OkHttpCall$1.onResponse(OkHttpCall.java:94) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.squareup.okhttp.Call$AsyncCall.execute(Call.java:168) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at com.squareup.okhttp.internal.NamedRunnable.run(NamedRunnable.java:33) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
11-11 16:11:17.755 28072-28072/my.api.example W/System.err:  at java.lang.Thread.run(Thread.java:841) 
11-11 16:11:17.755 28072-28072/my.api.example D/LOGIN_ACTIVITY: ERROR_MESSAGE Unparseable date: "1478880594000". Supported formats: [yyyy-MM-dd'T'HH:mm:ss, yyyy-MM-dd] 

這意味着這種方法不適用於我的日期格式。 我該如何處理這個異常?

有什麼想法嗎?

+0

將jsonElement.getAsString()轉換爲已註冊的格式化日期 –

+1

將json粘貼到此處以便更好地理解。 – Satendra

+0

@satendra:請看看更新後的帖子。 – Barrier

回答

0

從日誌中我可以看到你沒有通過java.util.Date,而是一個時間戳(long),並且你正在爲java.util.Date類註冊類型適配器。

1

根據錯誤,您分享的服務器返回的日期爲 毫秒,而不是您期望的格式。

com.google.gson.JsonParseException:無法解析的日期:「1478880594000」。支持的格式:[yyyy-MM-dd'T'HH:mm:ss,yyyy-MM-dd]。

首先您需要轉換爲日期,然後按照您的要求進行格式化。

1

更新此行

return new SimpleDateFormat(format, Locale.US).format(new Date(jsonElement)); 

希望這會工作。

+0

我會盡力讓你知道。 – Barrier

相關問題