最近在使用JSON,转换实体类时出现net.sf.ezmorph.bean.MorphDynaBean cannot be cast to xxx 错误, ClassCastException这类异常通常是类型转换错误。所以果断就看一下JSON字符串转换实体有什么问题?
上代码:
Entity:
public class XxxHead {
private String billNo;
...
private List<XxxBody> bodyList = Lists.newArrayList();
//省略了其他属性和get|set方法
}
public class XxxBody {
private String billNo;
...
//省略了其他属性和get|set方法
}
JSON2POJO:
XxxHead head = (XxxHead)JSONObject.toBean(JSONObject.fromObject(jsonStr), XxxHead.Class);
转换完成后不出现异常,对head.getBodyList.get(0)操作的时候出现异常,查了一些资料,很明确的是复杂格式的JSON转换POJO时,有list,map集合的时候,会有这个问题。
解决方法:
JSONObject.toBean(…)这个方法有5个,其中一个
JSONObject.toBean(JSONObject jsonObject, Class beanClass, Map classMap);
我们需要传入一个Map来指向这个集合。
JSON2POJO:
Map<String, Class> classMap = new HashMap<>();
classMap.put("bodyList", XxxHead.class);
XxxHead head = (XxxHead)JSONObject.toBean(JSONObject.fromObject(jsonStr), XxxHead.Class, classMap);
这样处理完成后,问题解决。
多提一下
很多人也这么做了,但是没解决问题,我这个方法跟网上很多都是一样的,但是需要注意
classMap.put("bodyList", XxxHead.class);
这个key(即bodyList)是与XxxHead中
private List<XxxBody> bodyList = Lists.newArrayList();
属性名字是对应的,不是随便写的。