解决Fastjson在PlayFramework下面出现JSONObject can not cast to XXXX的问题

在Play框架结合Fastjson使用时,遇到JavaBean内嵌List泛型丢失的问题。由于javassist代码增强导致泛型信息丢失,通过添加setter方法解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境

  • Fastjson 1.2.34
  • Play 1.4.4

背景

有个需求,需要在JavaBean里面嵌入一个List<Bean>,包含泛型。但在转换之后,调用List的数据就开始抛异常了。下面是Bean的示例代码:

public class Bean1 {

    public String name;

    public List<Bean2> beanList;
}
public class Bean2 {
    public Integer id;
}

相对应的json数据

[
    {
        "name": "hello",
        "beanList": [
            { "id": 1, updateTime: null},
            { "id": 2, updateTime: null}
        ]
    },
    {
        "name": "hello2",
        "beanList": [
            { "id": 3, updateTime: null},
            { "id": 4, updateTime: null}
        ]
    }
]

产生问题的原因

play框架引入了javassist工具,用来产生字节码增强,但是在生成代码的时候丢失了泛型,使得beanList从List<Bean2> beanList变成了List beanList。Fastjson在反序列化的时候,需要泛型才能得出Bean2类型,所以转换的时候出错,导致变成了JSONObject的原始类型。

出错代码:com.alibaba.fastjson.util.FieldInfo.java:106

解决办法

public class Bean1 {

    public String name;

    public List<Bean2> beanList;
    
    //添加setter
    public void setBeanList(List<Bean2> beanList){
        this.beanList = beanList;
    }
}

虽然javassist在增强代码的时候会丢失字段的泛型,但是不会丢失函数参数的泛型,所以利用这点可以让fastjson找回泛型类型。

总结

在playframework以及一些拥有代码增强的框架里面,需要特别注意fastjson等这些依赖泛型反射的框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值