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

当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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值