java - 转换从 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;
解决方案
不,你不能直接施放它。
Object obj = task.getResult().getData();
Events events = (Events) obj;
像那样。解决方案是
- 您手动解析 JSONObject 并使用 getter 和 setter 设置事件对象的属性。如果没有 getter 和 setter,则需要使用 JAVA 的 reflation。
- 您可以使用 Gson 库的注释创建自己的类,而不是将 JSONObject 转换为您的类。
推荐阅读
- c - 如何知道用户是否在输入窗口中输入了多个字符
- reactjs - 带有动态路由标签的嵌套 React 路由
- ios - 如果按下电源按钮,CallKit 集成视频通话应用结束通话后
- python - Binary function which searches an item in a sorted list always returns -1
- node.js - Mongoose find with or operator failing
- google-apps-script - 获取特定的开发者元数据参考
- javascript - amcharts4 使用多边形属性获取地图元素以链接到 URL
- python - tkinter 中的 CheckButton 会立即重置
- react-native - 世博会——在当地建造
- ruby-on-rails - 上传照片