- json数据转换异常:net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
执行:
JSONArray array = JSONArray.fromObject(this.users);
就会报以下错误:
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
users是一个list集合
错误原因:数据库中dltime字段类型位date,向JSONArray转换时出错
方案一:
JSONArray array = JSONArray.fromObject(this.users.toArray());
项目中没有.toArray()的也都正常运行了。这次异常中此方法没有解决问题。
方案二:
因为bean里有Date字段,且从数据库里读出来的是java.sql.Date,赋值给了java.util.Date,转化成JSONArray时出错;可以在从数据库读出Date 时直接写成:new java.util.Date(rs.getDate("date").getTime),这样就不会出错了;
!!就是将出错的数据读出来转成可以正常转换的数据类型 如util.date或者string然后再转成JSON
方案三:没懂
日期格式hibernate延时加载
1.解决:日期格式
private java.util.Date createTime;只在字段前声明Date的数据类型可能也会抛异常,在Set,get方法中,有出现Date类型的都把包名加上
2.解决:hibernate延时加载 设置
Java 代码-
JsonConfig cfg = new JsonConfig(); cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});
方法举例
-
Java代码
import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.hibernate.criterion.DetachedCriteria; import org.springframework.transaction.annotation.Transactional; import com.csValue.common.util.DateJsonValueProcessor; import net.sf.json.JSONArray; import net.sf.json.JsonConfig; import net.sf.json.util.CycleDetectionStrategy; import net.sf.json.util.PropertyFilter; public class test { @Transactional(readOnly = true) public JSONArray datagrid(Pager page,User user,DetachedCriteria detachedCriteria) { // 有级联,不能直接转化,要取出List放到map里面 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("addressGroup") || name.equals("user") || name.equals("createTime") || name.equals("birthday")) { return true; } else { return false; } } }); // net.sf.json.JSONException: // java.lang.reflect.InvocationTargetException异常 cfg.setExcludes(new String[] { "handler","hibernateLazyInitializer" }); // javabean里出现循环调用啦,赶快用excludes干掉parent或者children cfg.setExcludes(new String[] { "addressGroup" }); // net.sf.json.JSONException: // java.lang.reflect.InvocationTargetException日期格式转化出错 cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); cfg.registerJsonValueProcessor(Date.class,new DateJsonValueProcessor( "yyyy-MM-dd hh:mm:ss")); Pager pager = this.findAllByApprove(page,user,detachedCriteria); long total = pager.getTotalCount(); List list = pager.getResult(); Map result = new HashMap(); result.put("total",total); result.put("rows",list); JSONArray jsonArray = JSONArray.fromObject(result,cfg); return jsonArray; } }