解析net.sf.json.JSONException: java.lang.reflect.InvocationTargetException

好多人在开发项目的时候遇到这样的情况,就是使用SSH框架的时候,在使用JSONArray.fromObject()时候出现net.sf.json.JSONException: java.lang.reflect.InvocationTargetException异常,这种情况的出现是由于Date类型转换或是延迟加载,这里不解释过多,说一下解决办法:

方法一:过滤关联,使用JsonConfig的setExcludes()方法排除可能造成这种情况的数据项

JsonConfig cfg = new JsonConfig(); 
    //过滤关联,避免死循环net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 
    cfg.setJsonPropertyFilter(new PropertyFilter(){ 
    public boolean apply(Object source, String name, Object value){ 
    if(name.equals("preOrderRoomDetailSet")||name.equals("preArriveTime")||name.equals("preLeaveTime")||name.equals("orderTime")){ 
           return true; }
    else{ 
             return false;} 
    } 
      }); 
   cfg.setExcludes(new String[]{"preOrderRoomDetailSet","preArriveTime","preLeaveTime","orderTime"});  
   cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
   cfg.setIgnoreDefaultExcludes(false);
   cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);*/
   //cfg.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor(datePattern)); 
   /*Map<String,Object>map=new HashMap<String,Object>();
   map.put("total", count);//保存查询出记录的条数
   if(list!=null){
    map.put("rows",list);//保存查询出记录的详细信息
   }
   return JSONArray.fromObject(map,cfg).toString();

方法二:这种情况一般是在方法一失效的情况,这是很烦人的,只能自己拼json形式的字符串

int count = this.preOrderRoomDao.findRecordCount(sqlSignal, param);
   List<PreOrderRoom> list = this.preOrderRoomDao.getPreOrderRecordBySearch(sqlSignal, param);
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        
         StringBuffer sb = new StringBuffer();
         sb.append("{"); sb.append("'total':"+count+",'rows':[  ");
         for (int i = 0;i<list.size(); i++){
          sb.append("{'preOrderID':'" + list.get(i).getPreOrderID() + "','customerName':'" + list.get(i).getCustomerName() + "','customerPhone':'" + list.get(i).getCustomerPhone() + "','certificateNumber':'" + list.get(i).getCertificateNumber() + "','preArriveTime':'" + sdf.format(list.get(i).getPreArriveTime().getTime()) + "','preOrderStatus':'" + list.get(i).getPreOrderStatus() + "'}");
          if (i != list.size()-1){
           sb.append(",");}           
          }
         sb.append("] }");
         return sb.toString();
  }catch(Exception e){
   logger.debug(e.getMessage());
  }

返回的仍然是json格式的数据,使用时仍然可以按json类型的数据使用

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值