2017-09-26 11 views
0

で2つの日付の形式を解析するために、私は、サーバーからこのJSONを取得:どのようGson

{ 
     "Id": 94, 
     "RegisteredDate": "2013-09-29T18:46:19Z", 
     "EndDate": "2018-08-14T00:00:00" 
} 

と、私はこのコードを使用してそれを解析しよう:

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

JsonObject jsonObject = parser.parse(response) 
          .getAsJsonObject(); 

ContractData contractData = gson.fromJson(jsonObject, ContractData.class); 

が、GsonからRegisteredDateの解析に失敗しました私のモデルではJson so registeredDateはnullですが、endDateは正しく解析されているようです。

これらの日付をGsonで正しく解析する方法はありますか?

答えて

1

は、あなたの答えのための

public class ContractJsonDeSerializer implements JsonDeserializer<Date> { 

    public ContractJsonDeSerializer() { 
     //Constructor 
    } 

    @Override 
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     try { 
      String dateString = json.getAsJsonPrimitive().getAsString(); 
      if(android.text.TextUtils.isEmpty(dateString)) { 
       return null; 
      } 
      return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").parse(dateString); 
     } catch (ParseException e) { 
      return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").parse(dateString); 
     } 
    } 
} 
+0

はいです。 –

3

このカスタムシリアライザ/デシリアライザは、複数のフォーマットを処理できます。最初に1つの形式で解析することができますが、失敗した場合は2番目の形式で試してみてください。これはまた、爆破することなくヌル日付を処理する必要があります。

public class GsonDateDeSerializer implements JsonDeserializer<Date> { 

... 

private SimpleDateFormat format1 = new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a"); 
private SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss"); 

... 

@Override 
public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
    try { 
     String j = json.getAsJsonPrimitive().getAsString(); 
     return parseDate(j); 
    } catch (ParseException e) { 
     throw new JsonParseException(e.getMessage(), e); 
    } 
} 

private Date parseDate(String dateString) throws ParseException { 
    if (dateString != null && dateString.trim().length() > 0) { 
     try { 
      return format1.parse(dateString); 
     } catch (ParseException pe) { 
      return format2.parse(dateString); 
     } 
    } else { 
     return null; 
    } 
} 

これはうまくいきます。

+0

感謝を試してみてください。日付形式を「yyyy-MM-dd'T'HH:mm:ss'Z '」および「yyyy-MM-dd'T'HH:mm:ss」に変更する必要があります。 –