FastJson将json解析成含有泛型对象,内部泛型对象再次解析出错的解决办法(Android)
折腾小半天的问题,这里先感谢一下深圳的小伙子,远程帮我搞,虽然也没有搞出来==========FUCK
声明:Android开发下发生此异常,Java开发下并不会有这个问题
异常重现
简单说一下抛出异常的代码:
(1)解析json代码如下:
RecommendBean<RecommendListBean> obj = JSON.parseObject(jsonString, new TypeReference<RecommendBean<RecommendListBean>>(){}); RecommendListBean recommendListBean = (RecommendListBean) (obj.getData());
错误日志如下:
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.test.RecommendListBean
(2)model 如下:
package com.test; /** * Created by Travis on 2017/8/20. */ public class RecommendBean<T> { private int status; private String message; private T data; public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public T getData() { return data; } public void setData(T data) { this.data = data; } }
package com.test; import java.util.List; /** * Created by lenovo on 2017/8/20. */ public class RecommendListBean { private int count; private List<RecommendListItemBean> list; public int getCount() { return count; } public void setCount(int count) { this.count = count; } public List<RecommendListItemBean> getList() { return list; } public void setList(List<RecommendListItemBean> list) { this.list = list; } }
package com.test; import java.io.Serializable; /** * Created by Travis on 2017/8/20. */ public class RecommendListItemBean implements Serializable { private static final long serialVersionUID = 21455356667888L; private int uid; private String nickname; private int sex; private int age; private String avatar; private String theme_pic; private String job; private String signature; private String sound; private int sound_length; private int fee; public RecommendBean getRecommend() { return recommend; } public void setRecommend(RecommendBean recommend) { this.recommend = recommend; } private RecommendBean recommend; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public String getTheme_pic() { return theme_pic; } public void setTheme_pic(String theme_pic) { this.theme_pic = theme_pic; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public static class RecommendBean<T> implements Serializable { private static final long serialVersionUID = 21455356667889L; private int id; private int user_id; private int type; private Object content; private int zan; private int status; private String create_time; private String update_time; private int zanTotal; private int commentTotal; private T picture; private T video; public int getType() { return type; } public void setType(int type) { this.type = type; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUser_id() { return user_id; } public void setUser_id(int user_id) { this.user_id = user_id; } public Object getContent() { return content; } public void setContent(Object content) { this.content = content; } public int getZan() { return zan; } public void setZan(int zan) { this.zan = zan; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getCreate_time() { return create_time; } public void setCreate_time(String create_time) { this.create_time = create_time; } public String getUpdate_time() { return update_time; } public void setUpdate_time(String update_time) { this.update_time = update_time; } public int getZanTotal() { return zanTotal; } public void setZanTotal(int zanTotal) { this.zanTotal = zanTotal; } public int getCommentTotal() { return commentTotal; } public void setCommentTotal(int commentTotal) { this.commentTotal = commentTotal; } public T getPicture() { return picture; } public void setPicture(T picture) { this.picture = picture; } public T getVideo() { return video; } public void setVideo(T video) { this.video = video; } } }
原因分析:
经过debug发现此处泛型所在的地方,仍然还是JSONObject,而没有解析成对应的对象,仅仅只是将obj解析成需要的实体对象了。
即使此处使用强转,仍然会有报错信息:cannot be cast to com.test.RecommendListBean
解决办法: 换用GSON来解析,具体方法如下
Gson gson = new Gson(); RecommendBean<RecommendListBean> obj = gson.fromJson(jsonString, new TypeToken<RecommendBean<RecommendListBean>>(){}.getType()); RecommendListBean recommendListBean = (RecommendListBean) (obj.getData());