一、出错原因
当我们利用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<TransferDqRule> 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<String, Class<?>> classMap = new HashMap<>();
// TransferInfo类中的dqRules属性作为key, key对应的类型作为value
classMap.put("dqRules", TransferDqRule.class);
TransferInfo transferJobInfo = (TransferInfo) JSONObject.toBean(jsonObject, TransferInfo.class, classMap);
网友评论