[alibaba/fastjson]版本[1.2.47],泛型反序列化时提交com.alibaba.fastjson.JSONObject Cannot be Cast to XXX,附异常代码

2025-11-03 278 views
7

Fastjson版本:1.2.47 异常:com.alibaba.fastjson.JSONObject cannot be cast to XXXXX 简述: JSON字符串反序列化Java对象时,抛出无法类型转换,对象嵌套List泛型。 发生异常的代码如下: Channel.java

package test.model;

import java.util.List;

/**
 * 栏目
 */
public class Channel<T> {
    /**
     * 栏目ID
     */
    private String channelId;
    /**
     * 栏目名
     */
    private String channelName;
    /**
     * 该栏目下内容集合
     */
    private List<T> contents;

    public String getChannelId() {
        return channelId;
    }

    public void setChannelId(String channelId) {
        this.channelId = channelId;
    }

    public String getChannelName() {
        return channelName;
    }

    public void setChannelName(String channelName) {
        this.channelName = channelName;
    }

    public List<T> getContents() {
        return contents;
    }

    public void setContents(List<T> contents) {
        this.contents = contents;
    }
}

Article.java

package test.model;

/**
 * 文章
 */
public class Article {
    /**
     * 文章ID
     */
    private String articleId;

    /**
     * 文章名
     */
    private String articleName;

    public String getArticleId() {
        return articleId;
    }

    public void setArticleId(String articleId) {
        this.articleId = articleId;
    }

    public String getArticleName() {
        return articleName;
    }

    public void setArticleName(String articleName) {
        this.articleName = articleName;
    }

}

Test.java

package test;

import java.util.List;

import test.model.Article;
import test.model.Channel;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;

public class Test {

    /**
     * 测试JSON字符串反序列化时发生的类型转换异常
     */
    public <T> List<T> jsonToObject(String json,Class<T> contentClazzType){
        Channel<T> channel = JSON.parseObject(json, new TypeReference<Channel<T>>(){});
        return channel.getContents();
    }

    public static void main(String[] args) {
        String json = "{\"channelId\":\"1\",\"channelName\":\"新闻 \",\"contents\":[{\"articleId\":\"11\",\"articleName\":\"111\"},{\"articleId\":\"22\",\"articleName\":\"222\"}]}";
        Test test = new Test();
        List<Article> articleList = test.jsonToObject(json, Article.class);
        for(Article article :articleList){
            System.out.println("ArticleId=>"+article.getArticleId());
            System.out.println("ArticleName=>"+article.getArticleName());
        }
    }

}

运行Test.java抛出com.alibaba.fastjson.JSONObject cannot be cast to XXXXX

这个问题该怎么办?

回答

4

你的代码无法实现效果,因为你无法将对象解析为数组(列表)。

    public static void main(String[] args) {
        String json = "{\"channelId\":\"1\",\"channelName\":\"新闻 \",\"contents\":[{\"articleId\":\"11\",\"articleName\":\"111\"},{\"articleId\":\"22\",\"articleName\":\"222\"}]}";
        Channel<Article> channel = JSON.parseObject(json, new TypeReference<Channel<Article>>(){});
        List<Article> article = channel.getContents();
        article.stream().forEach(System.out::println);
    }

你可以用它做任何你想做的事情。@xiabobin

9

@cj96248

为什么 new TypeReference<List<T>>(){}.getType();这样是不行的?

java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to xxx

必须指定类型 new TypeReference<List<Friend>>(){}.getType(); 这样才可以

1

类型引用必须强制指定目标对象。 作者在TypeReference注释部分有说明,这个TypeReference是fastjson中提供的,请遵守其约定。

@MrshaoGx

1

1.2.47 泛型反序列化有点问题,升级版本就可以了