Как разобрать два формата даты с Gson

Я понял JSON с сервера:

{
      "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);

но Гсон не в состоянии разобрать RegisteredDate от Json так зарегистрировано null в моей модели, но endDate, кажется, анализируется правильно.

Есть ли способ правильно разобрать обе эти даты с Gson?

2 ответа

Решение

Пытаться

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);
        }
    }
}

Этот пользовательский сериализатор / десериализатор может обрабатывать несколько форматов. Сначала вы можете попробовать выполнить синтаксический анализ в одном формате, затем, если это не удастся, попробуйте второй формат. Это также должно обрабатывать нулевые даты без взрыва.

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;
    }
}

Надеюсь, это сработает для вас.

Другие вопросы по тегам