解决fastjson泛型转换报错

分享知识 传递快乐


错误信息
Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.xh.demo.UserDO

泛性类
@Data
public class ResultSetDTO<T> {
    private Integer totalSize;
    private Integer count;
    private List<T> records;
}

实体类
@Data
public class UserDO {

    private String id;
    private String name;
}

Demo测试
public class AppDemo {

    public static void main(String[] args) {
        ResultSetDTO<UserDO> resultSetDTO = new ResultSetDTO<UserDO>();
        resultSetDTO.setTotalSize(10);
        resultSetDTO.setCount(10);

        List<UserDO> list = new ArrayList<>();
        UserDO userDO = null;
        for (int i = 10000; i < 10003; i++) {
            userDO = new UserDO();
            userDO.setId(i + "");
            userDO.setName("TEST_" + i);
            list.add(userDO);
        }
        resultSetDTO.setRecords(list);

        String jsonString = JSON.toJSONString(resultSetDTO);
        System.out.println(jsonString);
        
        ResultSetDTO<XsyUserDO> resultSet = JSON.parseObject(jsonString, ResultSetDTO.class);
        List<UserDO> records = resultSet.getRecords();
        // 转换是报异常
        for (UserDO user : records) {
            System.out.println(user.getName());
        }
    }

debuge 调试时发现 resultSet.getRecords(); 返回的是 ArrayList<JSONObject> 类型,不是 ArrayList<UserDO> 类型。由于类型引用必须强制指定目标对象,因此违背了 FastJson 规范,所以报:Exception in thread "main" java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.xh.demo.UserDO。

在这里插入图片描述

解决方法

// 方法一
JSONObject parseObject = JSON.parseObject(jsonString);
List<UserDO> records = JSON.parseArray(parseObject.getString("records"), UserDO.class);
for (UserDO user : records) {
    System.out.println(user.getName());
}

// 方法二
ResultSetDTO<XsyUserDO> resultSet = JSON.parseObject(jsonString, ResultSetDTO.class);
List<UserDO> records = JSONObject.parseArray(resultSet.getRecords().toString(), UserDO.class);
for (UserDO user : records) {
    System.out.println(user.getName());
}

// 方法三
ResultSetDTO<XsyUserDO> resultSet = JSON.parseObject(jsonString, new TypeReference<ResultSetDTO<UserDO>>(){});
List<UserDO> records = resultSet.getRecords();
for (UserDO user : records){
    System.out.println(user.getName());}
}














———————————

如有不足请留言指正
相互学习,共同进步

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
在Java中使用fastjson进行泛型类的反序列化,你可以按照以下步骤进行操作: 首先,确保你已经引入了fastjson的依赖,可以通过Maven等构建工具添加以下依赖项: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.79</version> </dependency> ``` 接下来,假设你有一个泛型类`Result<T>`,如下所示: ```java import com.alibaba.fastjson.JSON; public class Result<T> { private int code; private String message; private T data; public Result(int code, String message, T data) { this.code = code; this.message = message; this.data = data; } public int getCode() { return code; } public String getMessage() { return message; } public T getData() { return data; } public static <T> Result<T> fromJson(String json, Class<T> clazz) { return JSON.parseObject(json, new TypeReference<Result<T>>(clazz) {}.getType()); } } ``` 在上述代码中,`fromJSON`方法使用fastjson的`parseObject`方法将JSON字符串反序列化为`Result<T>`对象。 然后,你可以使用以下代码将JSON字符串反序列化为具体的泛型类对象: ```java import com.alibaba.fastjson.JSON; public class Main { public static void main(String[] args) { String json = "{\"code\":200,\"message\":\"Success\",\"data\":{\"name\":\"John\",\"age\":25}}"; Result<User> result = Result.fromJson(json, User.class); System.out.println("Code: " + result.getCode()); System.out.println("Message: " + result.getMessage()); User user = result.getData(); System.out.println("Name: " + user.getName()); System.out.println("Age: " + user.getAge()); } } ``` 在上述代码中,我们将一个包含`User`对象的JSON字符串反序列化为`Result<User>`对象,并输出其中的字段值。 请注意,为了正确反序列化泛型类,我们需要通过传递`Class<T>`参数给`fromJSON`方法来指定具体的泛型类型。 以上就是使用fastjson进行泛型类反序列化的基本示例。当然,根据实际需求和数据结构的复杂程度,你可能需要进行更多的定制和处理。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旷野历程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值