Я пытаюсь интегрировать общедоступный календарь Google в мое приложение для Android. Чтобы сделать это без сложного потока oauth2, я использовал облачную функцию firebase для выполнения вызова API. Однако json, возвращенный моему приложению, имеет тип объекта java.lang. Я попытался привести это к типу событий Google Calendar, и я получил исключение IllegalCastException.
Что я пробовал:
Сначала я попытался использовать gson для преобразования объекта в строку json, затем с помощью функции fromJson преобразовать строку обратно в класс Events. Эта сортировка работала, но я получаю сообщение об ошибке, утверждая, что аргумент "events.Updated" имеет тип DateTime, но получил String ... Я пробовал различные методы, чтобы убедиться, что gson использует правильный формат даты, но в конце я попробовал что-то еще .
Затем я попытался использовать отражение для преобразования объекта, но потом я обнаружил, что вынужден использовать отражение для каждого подобъекта, и это становилось уродливым, поэтому я остановился.
Вот что я попытался для размышления:
Events placeholderEvents = new Events();
Class aClass = Events.class;
for (Field field : aClass.getDeclaredFields()) {
field.setAccessible(true);
if (map.containsKey(field.getName())) {
if (field.getType().toString().equals("class com.google.api.client.util.DateTime")) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Timestamp datetime = new Timestamp(simpleDateFormat.parse((String) map.get(field.getName())).getTime());
DateTime date = new DateTime(datetime);
field.set(placeholderEvents, date);
} else if (field.getType().toString().equals("interface java.util.List")) {
ArrayList<Object> innerArray = (ArrayList<Object>) map.get(field.getName());
List<Event> placeholderList = new ArrayList<>();
Class secondClass = placeholderList.getClass();
for (Object object : innerArray) {
for (Field innerField : secondClass.getDeclaredFields()) {
innerField.setAccessible(true);
if (innerArray.contains(innerField.getName())) {
Log.i("innerfield", "" + innerArray.get(innerArray.indexOf(innerField.getName())));
innerField.set(placeholderList, innerArray.get(innerArray.indexOf(innerField.getName())));
}
}
}
field.set(placeholderEvents, placeholderList);
} else {
field.set(placeholderEvents, map.get(field.getName()));
}
}
}
return placeholderEvents;
Итак, мой вопрос: как я могу привести объект, для которого я знаю тип его содержимого во время компиляции, к его типу, чтобы я мог получить доступ к функциям, зависящим от типа? Я знаю, что это должен быть тип события, но я не могу привести его из объекта.
Возможно ли что-то подобное?
Object obj = task.getResult().getData();
Events events = (Events) obj;