JSON字符串转javabean,报net.sf.ezmorph.bean.MorphDynaBean cannot be cast to.....

来源:互联网 发布:csgo 服务器优化 编辑:程序博客网 时间:2024/06/10 16:41

当json里含有list,list里含有map或其他对象时,我们就可能有这种错误出现:


JSON串:

  {"seqNo":2,"taskName":"入库","taskDiscription":"这是入库状态","status":"0","performUser":"发起人","rollbackTaskId":"","guideId":"",
"managerOfType":"author",
"formFieldSettingData":{"formId":"1","taskName":"入库",
"settingData":[{"model":"planCode","fieldstatus":"1"},{"model":"planName","fieldstatus":"1"},{"model":"planType","fieldstatus":"1"},
{"model":"planBriefContent","fieldstatus":"1"},{"model":"groupApprovalNum","fieldstatus":"1"},{"model":"planYear","fieldstatus":"2"},
{"model":"planExeCuteMonth","fieldstatus":"2"},{"model":"visitDays","fieldstatus":"2"},{"model":"visitCountrys","fieldstatus":"1"},
{"model":"countryReceptionUnit","fieldstatus":"1"},{"model":"visitPersons","fieldstatus":"1"},{"model":"costCommitment","fieldstatus":"1"},
{"model":"groupUnit","fieldstatus":"1"},{"model":"attendGroupUnit","fieldstatus":"1"},{"model":"accordedFile","fieldstatus":"1"},
{"model":"annualBudget","fieldstatus":"1"},{"model":"comment","fieldstatus":"1"}]}}




public class SettingData implements Serializable {    private static final long serialVersionUID = 1L;   private String model;    private String fieldstatus;    public String getModel() {        return model;    }    public void setModel(String model) {        this.model = model;    }    public String getFieldstatus() {        return fieldstatus;    }    public void setFieldstatus(String fieldstatus) {        this.fieldstatus = fieldstatus;    }}



1、用最普通的方法:是能完成解析的

JSONObject data1 = JSONObject.fromObject(tTt.getFormFieldSettingData());String formId = data1.getString("formId");System.out.println(formId);String settingData = data1.getString("settingData");JSONArray arr1 = JSONArray.fromObject(settingData);System.out.println(arr1);System.out.println(arr1.get(0).toString());for (int j = 0; j < arr1.size(); j++) {JSONObject jsonObject = arr1.getJSONObject(j);String model = jsonObject.getString("model");String fieldstatus = jsonObject.getString("fieldstatus");System.out.println(model + "+" + fieldstatus);}


2.但是如果用对象反序列化处理的话

TTemplateTask ttempTask = (TTemplateTask) JSONObject.toBean(jsonObject, TTemplateTask.class);
在存储时是能成功的,但是取值时
String model=tTt.getFormFieldSettingData().getSettingData().get(j).get("model").toString();
就会报出
MorphDynaBean cannot be cast to 。。。异常,
原因是我在TTemplateTask这个实体类中存放了一个List<Map> settingData来存放后面的值,
JSONObject.toBean(jsonObject, TTemplateTask.class)在做反序列化是并没有按照你想的那样将值反序列化成map类型存放到你的实体类中,
从断点中可以看到是以MorphDynaBean这种类型的方式存在了。所以会抛出转化异常。
解决办法:就要转化成map的那一串json 作为一个小的实体类拿出来,
public class SettingData implements Serializable {    private static final long serialVersionUID = 1L;   private String model;    private String fieldstatus;    public String getModel() {        return model;    }    public void setModel(String model) {        this.model = model;    }    public String getFieldstatus() {        return fieldstatus;    }    public void setFieldstatus(String fieldstatus) {        this.fieldstatus = fieldstatus;    }}
然后:
Map classMap = new HashMap();classMap.put("settingData",SettingData.class);ttempTask = (TTemplateTask) JSONObject.toBean(jsonObject, TTemplateTask.class,classMap);
底层方法调用截图:json先转化含有的内层对象如map,
再转化成对象
这样就能在转化为Bean的时候先将map类型放进去再转化为对象了
String model=tTt.getFormFieldSettingData().getSettingData().get(j).getModel()

0 0