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