Java IllegalCastException при приведении объекта, возвращенного из вызова API - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь интегрировать общедоступный календарь 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;

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Использование

((Events)obj).eventFunction();

Вам просто нужно убедиться, что весь состав в скобках

0 голосов
/ 02 ноября 2018

Нет, вы не можете разыграть его напрямую.

Object obj = task.getResult().getData();
Events events = (Events) obj;

вот так. решение

  1. Вы вручную анализируете JSONObject и используете геттеры и сеттеры для установки свойства объекта события. Если у вас нет геттера и сеттера, вам нужно использовать рефракцию JAVA.
  2. Вы создаете свой собственный класс с аннотациями библиотеки Gson, чем Вы можете конвертировать JSONObject в свой класс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...