如下代码:
StringBuilder sb = new StringBuilder("["); sb.append("{"); sb.append("cremindTitle:\"小名\","); sb.append("cremindDate:\"2012-06-05 19:20:22\","); sb.append("cremindRemark:\"阿斯蒂芬\""); sb.append("}"); sb.append("]"); List<Cremind> clist = JSONArray.toList(JSONArray.fromObject(sb.toString()), Cremind.class);
在执行中会报错,原因是由于日期类型字串到日期类型Timestamp的转换,解决思路如下:
编写一个Morpher类继承自AbstractObjectMorpher
class TimeStampMorpher extends AbstractObjectMorpher{ private Logger LOG = Logger.getLogger(TimeStampMorpher.class); private String format ="yyyy-MM-dd hh:mm:ss"; public void setFormat(String format) { this.format = format; } public TimeStampMorpher() { // TODO Auto-generated constructor stub } public TimeStampMorpher(String format) { this.format = format; } @Override public Object morph(Object dateStr) { // TODO Auto-generated method stub try { java.util.Date date = new SimpleDateFormat(format).parse(dateStr.toString()); return new Timestamp(date.getTime()); } catch (ParseException e) { // TODO Auto-generated catch block if (LOG.isInfoEnabled()) LOG.info("日期格式可能无效,将采用系统当前日期"); e.printStackTrace(); } return new java.sql.Timestamp(System.currentTimeMillis());//返回默认日期 } @Override public Class morphsTo() { // TODO Auto-generated method stub return Timestamp.class; } }
最终处理版本:
package com.defshare.foundation.global; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.List; import org.apache.log4j.Logger; import net.sf.ezmorph.object.AbstractObjectMorpher; import net.sf.json.JSONArray; import net.sf.json.util.JSONUtils; class TimeStampMorpher extends AbstractObjectMorpher{ private Logger LOG = Logger.getLogger(TimeStampMorpher.class); private String format ="yyyy-MM-dd hh:mm:ss"; public void setFormat(String format) { this.format = format; } public TimeStampMorpher() { // TODO Auto-generated constructor stub } public TimeStampMorpher(String format) { this.format = format; } @Override public Object morph(Object dateStr) { // TODO Auto-generated method stub try { java.util.Date date = new SimpleDateFormat(format).parse(dateStr.toString()); return new Timestamp(date.getTime()); } catch (ParseException e) { // TODO Auto-generated catch block if (LOG.isInfoEnabled()) LOG.info("日期格式可能无效,将采用系统当前日期"); e.printStackTrace(); } return new java.sql.Timestamp(System.currentTimeMillis());//返回默认日期 } @Override public Class morphsTo() { // TODO Auto-generated method stub return Timestamp.class; } } public final class JsonUtil { /** * json数组字串到json数组对象<br/> * <pre> * StringBuilder sb = new StringBuilder("["); * sb.append("{"); * sb.append("cremindTitle:\"xiaoqiang\","); * sb.append("cremindDate:\"2012-06-0519:20:22\","); * sb.append("cremindRemark:\"xiaoqiangremark\""); * sb.append("}"); * sb.append("]"); * </pre> * @param jsonArray * @param classzz */ public static final <T> List<T> jsonArrayToList(String jsonArray,Class classzz){ JSONUtils.getMorpherRegistry().registerMorpher(new TimeStampMorpher()); // JSONUtils.getMorpherRegistry().registerMorpher(new TimeStampMorpher()); // StringBuilder sb = new StringBuilder("["); // sb.append("{"); // sb.append("cremindTitle:\"小名\","); // sb.append("cremindDate:\"2012-06-0519:20:22\","); // sb.append("cremindRemark:\"阿斯蒂芬\""); // sb.append("}"); // sb.append("]"); // List<Cremind> clist = JSONArray.toList(JSONArray.fromObject(sb.toString()), // Cremind.class); return JSONArray.toList(JSONArray.fromObject(jsonArray),classzz); } }
项目中表示层Action调用:
/** * 新增客户 * 请求参数: * name:客户名称 * cno:客户编号(跟ID不同) * customKindId:客户性质ID * phone:公司电话 * fax:公司传真 * address:客户地址 * siteUrl:公司网址 * cIndustryId:客户行业ID * cIndustryNum:行业排名 * mainSellProduct:主营产品 * cbuildDate:成立时间 * clevelId:客户级别ID * signTag:签约标志 * remind:[{ * cremindTitle:提醒名称 * cremindDate:提醒日期 * cremindRemark:备注 * },{},{}] * @return * @throws Exception */ public String addCustomer() throws Exception{ return super.executeAction(new IExecuteActionCallback() { public String execute(BaseJSONAction baseJsonAction) { Customer cst = new Customer(); bindParam2Bean(cst);//绑定请求参数到对象 //处理特殊参数的绑定 //处理客户性质ID String customKindId = getParam("customKindId").toString(); if (!StringUtils.isBlank(customKindId)){ CustomKind ck = new CustomKind(); ck.setCustomKindId(Integer.valueOf(customKindId)); cst.setCustomKind(ck); } //处理客户行业 String cIndustryId = getParam("cIndustryId").toString(); if(!StringUtils.isBlank(cIndustryId)){ Cindustry cs = new Cindustry(); cs.setCindustryId(Integer.valueOf(cIndustryId)); cst.setCindustry(cs); } //处理客户级别 String clevelId = getParam("clevelId").toString(); if(!StringUtils.isBlank(clevelId)){ Clevel cl = new Clevel(); cl.setClevelId(Integer.valueOf(clevelId)); cst.setClevel(cl); } //處理註冊時間 cst.setCregArchDate(DateUtil.getTimestamp()); if (cst.getCbuildDate()==null) cst.setCbuildDate(DateUtil.getTimestamp()); //處理所屬員工 Emp emp = getCurrentUser(); if (emp!=null) cst.setEmp(emp); //处理提醒 String remind = getParam("remind").toString(); //反序列化JSON字符串到对象数组 //List<Cremind> clist = JSONArray.toList(JSONArray.fromObject(remind),Cremind.class); List<Cremind> clist = JsonUtil.jsonArrayToList(remind, Cremind.class); //设置客户提醒 cst.setCreminds(new HashSet(clist)); cstService.addCustomer(cst); return SUCCESS; } }); }