在使用JSONObject对象把获取到的字符串转换成项目中的实体对象时经常会发现被转换成了MorphDynaBean对象,非常恶心,如下方法可把字符串转换成自己想要的对象。
JSONObject jsonObject = JSONObject.fromObject(str);
Map<String,Class> classMap = new HashMap<>();
classMap.put("list_data", AdsReportWarnPlacePeriodWeek.class);
classMap.put("summary_info_data", AdsReportWarnPlaceRegularWeek.class);
//转换对象
WordAndPDFTemplateVo wordOrPdfVo = (WordAndPDFTemplateVo) JSONObject.toBean(jsonObject, WordAndPDFTemplateVo.class,classMap);
举例:
具体场景,前端有一些配装的字符,提交至后端后需要转换称具体的vo或者pojo实体进其他操作。
如:
function appedData(type) {
var WordOrPDFVo = {
// 工作日环比分析图表svg字符串
anylize_avg:slice_chart.getSVG() + "_" +on_ramp_chart.getSVG() + "_" +off_ramp_chart.getSVG() + "_"
+ inter_chart.getSVG(),
// 时段分析图表svg字符串
summary_charts_svg: morning_peak_chart.getSVG() + "_" + off_peak_chart.getSVG() + "_" + noon_peak_chart.getSVG(),
// 报告标题
report_title:report_title_vo,
// 1.总体分析
// 总体分析标题
allringtatio_title:allringtatio_title_vo,
title_all:title_all_vo,
data_all:data_all_vo,
title_weekday:title_weekday_vo,
data_weekday:data_weekday_vo,
title_notweekday:title_notweekday_vo,
data_notweekday:data_notweekday_vo,
title_charts:title_charts_vo,
title_summary:title_summary_vo,
title_line_summary:title_line_summary_vo,
line_summary:line_summary_vo,
// 2、本周环比上周平均报警数量大幅度上升和下降点位解析
week_title:week_title_vo,
week_info_title:week_info_title_vo,
list_line:list_line_vo,
list_data:list_data_vo,
// 3.工作日高架分类别、分时段 TOP 报警点位及相应信号灯调控次数和效果分析
highway_title:highway_title_vo,
highway_info_title:highway_info_title_vo,
highway_info_data:highway_info_data_vo,
// 4、工作日路口分类别、分时段 TOP 报警点位及相应信号灯调控次数分析
inter_title:inter_title_vo,
inter_info_title:inter_info_title_vo,
inter_info_data:inter_info_data_vo,
inter_info_data_summary:inter_info_data_summary_vo,
// 5、总论
summary_title:summary_title_vo,
summary_info_title:summary_info_title_vo,
summary_info_line:summary_info_line_vo,
summary_info_data:summary_info_data_vo,
export_type:type
};
$("#str").val(JSON.stringify(WordOrPDFVo));
}
$(function(){
$("#btn_word").bind("click",function(){
appedData("word");
$("#form1").attr("action","createWordOrPdf")
$("#form1").submit();
$("#str").val("");
});
$("#btn_pdf").bind("click",function(){
appedData("pdf");
$("#form1").attr("action","createWordOrPdf")
$("#form1").submit();
$("#str").val("");
});
});
实体:
public class WordAndPDFTemplateVo {
// 报告标题
private String report_title;
// 1.总体分析
// 总体分析标题
private String allringtatio_title;
private String title_all;
private List<String> data_all;
private String title_weekday;
private List<String> data_weekday;
private String title_notweekday;
private List<String> data_notweekday;
private String title_charts;
private String title_summary;
private String title_line_summary;
private List<String> line_summary;
// 2、本周环比上周平均报警数量大幅度上升和下降点位解析
private String week_title;
private String week_info_title;
private List list_line;
private List<AdsReportWarnPlacePeriodWeek> list_data;
// 3.工作日高架分类别、分时段 TOP 报警点位及相应信号灯调控次数和效果分析
private String highway_title;
private String highway_info_title;
private List highway_info_data;
// 4、工作日路口分类别、分时段 TOP 报警点位及相应信号灯调控次数分析
private String inter_title;
private String inter_info_title;
private List inter_info_data;
private String inter_info_data_summary;
// 5、总论
private String summary_title;
private String summary_info_title;
private String summary_info_line;
private List<AdsReportWarnPlaceRegularWeek> summary_info_data;
// svg字符串
// 工作日环比分析图表svg字符串
private String anylize_avg;
// 时段分析图表svg字符串
private String summary_charts_svg;
private String export_type; // word pdf
public WordAndPDFTemplateVo() {
}
省略get、set方法。。。
后端接收
JSONObject jsonObject = JSONObject.fromObject(str);
Map<String,Class> classMap = new HashMap<>();
classMap.put("list_data", AdsReportWarnPlacePeriodWeek.class);
classMap.put("summary_info_data", AdsReportWarnPlaceRegularWeek.class);
//转换对象
WordAndPDFTemplateVo wordOrPdfVo = (WordAndPDFTemplateVo) JSONObject.toBean(jsonObject, WordAndPDFTemplateVo.class,classMap);
如果不这样设置接受到的所有List对象都将转换成
List<MorphDynaBean>
这样操作起来非常麻烦
如果转换成MorphDynaBean对象,对其判断其是否包含某个熟悉可以用如下方法
/**
* 检测 DynaClass 对象中有某个属性
* @param key
* @param dynaClass
* @return
*/
public boolean checkProperty(String key, DynaClass dynaClass){
if(dynaClass==null){
return false;
}
boolean flag = false;
try {
DynaProperty[] properties = dynaClass.getDynaProperties();
if(properties.length>0){
for(DynaProperty property:properties){
if(StringUtils.equals(property.getName(),key)){
flag = true;
break;
}
}
}
}catch (Exception e){
return flag;
}
return flag;
}
dynaClass 是 MorphDynaBean.getDynaClass()获取到的。