Как разобрать два формата даты с 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;
}
}
Надеюсь, это сработает для вас.