Retrofit 泛型解析遇到com.google.gson.internal.LinkedTreeMap cannot be cast to object

在Retrofit网络请求数据,使用泛型解析json时,出现了com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise的异常,折腾了好久总算解决了。
先看下异常log:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xylife.community.bean.Exercise
at com.xylife.community.adapter.ExerciseListAdapter.onBindViewHolder(ExerciseListAdapter.java:36)
at jp.wasabeef.recyclerview.adapters.AnimationAdapter.onBindViewHolder(AnimationAdapter.java:54)
at com.cundong.recyclerview.HeaderAndFooterRecyclerViewAdapter.onBindViewHolder(HeaderAndFooterRecyclerViewAdapter.java:258)
at android.support.v7.widget.RecyclerView Adapter.onBindViewHolder(RecyclerView.java:5471)atandroid.support.v7.widget.RecyclerView Adapter.bindViewHolder(RecyclerView.java:5504)
at android.support.v7.widget.RecyclerView Recycler.getViewForPosition(RecyclerView.java:4741)atandroid.support.v7.widget.RecyclerView Recycler.getViewForPosition(RecyclerView.java:4617)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1994)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1390)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1353)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:574)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1695)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15718)
at android.view.ViewGroup.layout(ViewGroup.java:5039)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15718)
at android.view.ViewG

下面我们分析下。

先看json数据。

{
    "state": "1001",
    "resut": {
        "data": {
            "total": "9",
            "list": [
                {
                    "name": "微博",
                    "desc": "本地相机即拍即传,随时随地分享身边新鲜事",
                    "size": "36.58M",
                    "icon": "http://p18.qhimg.com/t0194819784f6b3224b.png",
                    "url": "http://shouji.360tpcdn.com/150723/de6fd89a346e304f66535b6d97907563/com.sina.weibo_2057.apk"
                },
                {
                    "name": "开心消消乐",
                    "desc": "宇宙超人气三消休闲游戏“开心消消乐”",
                    "size": "55.49M",
                    "icon": "http://p17.qhimg.com/t01f9c104ccb2614350.png",
                    "url": "http://shouji.360tpcdn.com/150707/2ef5e16e0b8b3135aa714ad9b56b9a3d/com.happyelements.AndroidAnimal_25.apk"
                }
            ]
        }
    }
}

这里要感谢有心课堂的stay4it给我写的测试接口(虽然我们不熟),如果你幸运,还能打开链接:http://api.stay4it.com/test/jdsjlzx.php

这里不再讲解Retrofit和RxJava的知识,有需要请看扔物线大神的讲解:http://gank.io/post/560e15be2dca930e00da1083

Retrofit快速入门:http://blog.csdn.net/jdsjlzx/article/details/51354778

先看个简单的根据json数据来创建一个Response数据对象:

public class Response<T> {

    public boolean isSuccess() {
        return state == 1001;
    }


    public int total;
    public int state;
    public String reason;
    public T result;
}

根据http://api.stay4it.com/test/jdsjlzx.php接口返回的json数据,我们写出如下数据对象:

public class ListResponse<T> extends HttpResponse {

    public ListEntity resut;

    public class ListEntity{
        public Data data;
    }

    public class Data<T>{
        public int total;
        public List<T> list;
    }

}

HttpResponse代码

public class HttpResponse{

    public boolean isSuccess() {
        return state == 1001;
    }

    public int state;
}

调试中就毫不留情的抛出了异常。
这里写图片描述

查找资料,找各种办法。


问题没有解决之前,还找到了篇好文章:
Java泛型让声明方法返回子类型


不经意的那么一瞬间,有个念头闪过脑海,赶紧试了下,没有想到解决了问题。

快来看看吧。

public class ListResponse<T> extends HttpResponse {

    public ListEntity<T> resut;

    public class ListEntity<T>{
        public Data<T> data;
    }

    public class Data<T>{
        public int total;
        public List<T> list;
    }

}

写到这里已经是深夜23:52了,当解决问题的那一刻顿时有种如释重负的感觉。。。。

分享知识,希望这个思路能够帮助其他人!

至于泛型为什么非要那么写才能解决问题,我还没有理解到位,如果有高人知道请指教!

如果你是Java编程,上面的思路如果不行,请参考:http://www.ways2u.com/?post=535

根据提供的引用内容,可以看出这是一个Android编程的问题,需要使用Bundle传递对象。在这个问题中,需要创建一个Person类,该类需要实现Serializable接口,以便在不同的Activity之间传递。在HobbyActivity中,需要创建一个ArrayList<Person>泛型集合,保存四个Person类的对象,并使用ListView显示姓名。当单击姓名时,需要进入MessageActivity,显示姓名、年龄和爱好。最终结果应该显示BMI计算器张三李四王五赵权。 具体步骤如下: 1. 创建Person类,该类需要实现Serializable接口,以便在不同的Activity之间传递。 2. 在HobbyActivity中,创建一个ArrayList<Person>泛型集合,保存四个Person类的对象,并使用ListView显示姓名。 3. 当单击姓名时,使用Intent传递该Person对象到MessageActivity中。 4. 在MessageActivity中,获取传递过来的Person对象,并显示姓名、年龄和爱好。 代码示例: 1. Person类的定义: ``` public class Person implements Serializable { private String name; private int age; private String hobby; public Person(String name, int age, String hobby) { this.name = name; this.age = age; this.hobby = hobby; } public String getName() { return name; } public int getAge() { return age; } public String getHobby() { return hobby; } } ``` 2. 在HobbyActivity中,创建ArrayList<Person>泛型集合,并使用ListView显示姓名: ``` ArrayList<Person> personList = new ArrayList<>(); personList.add(new Person("张三", 20, "篮球")); personList.add(new Person("李四", 22, "足球")); personList.add(new Person("王五", 25, "乒乓球")); personList.add(new Person("赵权", 18, "羽毛球")); ListView listView = findViewById(R.id.listView); ArrayAdapter<Person> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, personList); listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent intent = new Intent(HobbyActivity.this, MessageActivity.class); intent.putExtra("person", personList.get(position)); startActivity(intent); } }); ``` 3. 在MessageActivity中,获取传递过来的Person对象,并显示姓名、年龄和爱好: ``` TextView nameTextView = findViewById(R.id.nameTextView); TextView ageTextView = findViewById(R.id.ageTextView); TextView hobbyTextView = findViewById(R.id.hobbyTextView); Intent intent = getIntent(); Person person = (Person) intent.getSerializableExtra("person"); nameTextView.setText(person.getName()); ageTextView.setText(String.valueOf(person.getAge())); hobbyTextView.setText(person.getHobby()); ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值