zoukankan      html  css  js  c++  java
  • 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());
    

      

  • 相关阅读:
    bzoj4598: [Sdoi2016]模式字符串
    bzoj3156: 防御准备
    bzoj1966: [Ahoi2005]VIRUS 病毒检测
    bzoj3170: [Tjoi2013]松鼠聚会
    bzoj3171: [Tjoi2013]循环格
    POJ1068Parencodings
    2013年山东省第四届ACM大学生程序设计竞赛 Alice and Bob
    POJ2632Crashing Robots
    POJ1328Radar Installation
    POJ2586Y2K Accounting Bug
  • 原文地址:https://www.cnblogs.com/xuanwei-qingfeng/p/7400093.html
Copyright © 2011-2022 走看看