首页 > 解决方案 > 转换从 API 调用返回的对象时出现 Java IllegalCastException

问题描述

我正在尝试将公共谷歌日历集成到我的 android 应用程序中。为了在没有复杂的 oauth2 流程的情况下做到这一点,我使用了一个 firebase 云函数来执行 API 调用。但是,返回给我的应用程序的 json 具有 java.lang Object 类型。我尝试将其转换为 google 日历事件类型,但收到 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 转换为它的类型,以便我可以访问特定于类型的函数?我知道它应该是事件类型,但我不能从对象中转换它。

这样的事情可能吗?

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

标签: javaandroidcastinggoogle-calendar-api

解决方案


不,你不能直接施放它。

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

像那样。解决方案是

  1. 您手动解析 JSONObject 并使用 getter 和 setter 设置事件对象的属性。如果没有 getter 和 setter,则需要使用 JAVA 的 reflation。
  2. 您可以使用 Gson 库的注释创建自己的类,而不是将 JSONObject 转换为您的类。

推荐阅读