解决net.sf.json.JSONObject解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cann...

原文链接

一、出错原因

当我们利用net.sf.json.JSONObject解析中的toBean方法时,如果它的属性里面包含复杂对象,那么在我们调用这个复杂对象时就会出现这个错误:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cannot be cast to XXX

二、出错原因

@Getter
@Setter
@ToString
public class TransferInfo {
    /**
     * 主键
     */
    private Integer id;
    /**
     * 任务名称
     */
    private String taskName;
    /**
     * 任务描述
     */
    private String description;
    /**
     * 数据质量规则
     */
    private List dqRules;
}

测试json

{
    "id":0,
    "taskName":"testol",
    "description":"离线接入测试",
    "dqRules":[
        {
            "ruleType":0,
            "checkType":0,
            "warnLevel":2,
            "columnName":"",
            "checkValue":"",
            "threshold":"",
            "key":0
        },
        {
            "ruleType":0,
            "checkType":1,
            "warnLevel":2,
            "columnName":"",
            "checkValue":10,
            "threshold":10,
            "key":1594698533182
        },
        {
            "ruleType":1,
            "checkType":2,
            "warnLevel":2,
            "columnName":"id",
            "checkValue":"",
            "threshold":"",
            "key":1594698538962
        }
    ]
}

测试例子:

JSONObject jsonObject = JSONObject.fromObject(data);
TransferInfo transferJobInfo = (TransferInfo) JSONObject.toBean(jsonObject, TransferInfo.class);

// 下面的操作会出现ClassCastException异常
for (TransferDqRule dqRule : transferJobInfo.getDqRules()) {
            dqRule.setTransferJobId(transferJob.getId());
            dqRule.setCreator(erp);
            dqRule.setModifier(erp);
            dqRule.setDealWay(info.getDealWay());
 }

三、解决方案

1. json转化为带有list集合的复杂对象时出现的ClassCastException异常的解决方案

新建一个map对象
以list集合的名称作为key,list集合里面的对象的Class作为value存入到map对象里面
在将json对象转化为javaBean对象时将新建的map作为最后一个参数传入到toBean方法里面
示例代码如下:

JSONObject jsonObject = JSONObject.fromObject(data);
Map> classMap = new HashMap<>();
// TransferInfo类中的dqRules属性作为key, key对应的类型作为value
classMap.put("dqRules", TransferDqRule.class);
TransferInfo transferJobInfo = (TransferInfo) JSONObject.toBean(jsonObject, TransferInfo.class, classMap);

你可能感兴趣的:(解决net.sf.json.JSONObject解析出现:java.lang.ClassCastException: net.sf.ezmorph.bean.MorphDynaBean cann...)