【问题标题】:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to model class androidjava.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为模型类 android
【发布时间】:2018-01-11 09:33:36
【问题描述】:

我正在将API 调用(使用Retrofit)的响应传递给一个类,并尝试将其转换为我的模型类。由于我使用 retrofit 进行 API 调用,它会在使用 Gson 将其转换为模型类对象之前根据来自服务器的响应生成链接的哈希图。 (这就是我的理解,如果我错了,请纠正我)。我附上了一张我用响应对象调试时可以看到的图像。如何将此响应转换为我的模型类或对象类型的对象。 当我尝试将类型 Object 转换到我的活动中的模型类时,我遇到了类转换异常。

这是我的代码

API 调用

call.enqueue(new Callback() {

        @Override
        public void onResponse(Call call, Response response) {
            if (response.body() != null) {   
                        List<CategoriesBaseModel> categoryBaseResponseList = (List<CategoriesBaseModel>) response.body();
                        List<Object> categoryResponseList = (List<Object>) categoryBaseResponseList.get(0).getData();
                        if (categoryResponseList != null) {
                           mCategoriesInterface.passCategoriesResponse(categoryResponseList, "HomeFragment");
                        }
            }                
        }
        @Override
        public void onFailure(Call call, Throwable t) {

            call.cancel();
        }
    });

活动

CategoriesInterface categoriesInterface = new CategoriesInterface() {
    @Override
    public void passCategoriesResponse(List<Object> scheduleList, String name) {
        CategoriesModel categoriesModel;
        for (Object model : scheduleList){
            categoriesModel = (CategoriesModel) model;
            Log.d("TAG", "");
        }
    }
};

【问题讨论】:

  • 看到这个页面,也许他会给你一个答案:stackoverflow.com/questions/32444863/…
  • 错误是否恰好出现在这一行?:categoriesModel = (CategoriesModel) model;
  • @gil.fernandes 是的。正好在同一行
  • 问题是它不能作为哈希映射访问,如果我投射对象会引发异常
  • 虽然这不是一个很好的解决方案:您可以手动将 LinkedTreeMap 转换为 CategoriesModel 对象。这绝对是可能的,但不是最优雅的解决方案。您可以将model 对象转换为java.util.Map,然后愉快地获取每个字段。

标签: java android gson retrofit linkedhashmap


【解决方案1】:

通过将 Object 转换为 Json 字符串并将其直接转换回模型类对象来解决此问题。

Gson gs = new Gson();
String js = gs.toJson(model);
categoriesModel = gs.fromJson(js, CategoriesModel.class);

【讨论】:

  • 虽然代码很紧凑,但这并不是一个非常高效的选项。你序列化然后反序列化。如果您没有太多数据,这可能没有太大区别,但如果您这样做,这对性能非常不利。
猜你喜欢
  • 1970-01-01
  • 2020-05-03
  • 2018-06-10
  • 2020-09-20
  • 1970-01-01
  • 2016-11-21
  • 2020-03-04
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多