问题描述:
在项目中写了一个方法从数据库查询信息,返回List<Map<String,Object>>,如下面语句:
//1.根据条件获取未完成的基本信息 List<Map<String,Object>> list = getUncompliateInfo(Condition condition); //2.将list转为JSONArray JSONArray array = JSONArray.fromObject(list);
obj.element("data",array);
其实一般这么写,不会出现问题,而且大部分开发者都是这么用的,但是今天我的程序报异常:
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
问题分析:
经过我查阅资料,调试代码,发现我获取的list中的map的value值有null,也有new java.sql.date类型的时间值,这就是问题的原因。
问题原因:
获取的值有java中不识别的数据类型。如:java.sql.date,并不是java中的时间类型java.utils.date。
解决办法:
解决问题的办法是将java.sql.date转为java.utils.date,如:java.utils.date(date);并将null值写成空的字符串[ "" ];
我的解决办法是循环了获取到的list,将list中map的值遍历重新处理了一一遍,把不规范的数据规范化,所以在返回获取到的list之前,调用这个方法,处理一遍。
下面是我的处理代码,本代码仅供参考:
private List<Map<String,String>> getNewList(List<Map> list){ List<Map<String,String>> result = new ArrayList<Map<String,String>>(); if(!list.isEmpty()&&list.size()>0){ Date date = new Date(); for(Map map:list){ Map<String,String> tempMap = new HashMap<String,String>(); for (Iterator i = map.keySet().iterator(); i.hasNext();) { String key = (String) i.next(); if(map.get(key)==null){ tempMap.put(key, ""); }else{ tempMap.put(key, map.get(key).toString().equals("")?"":map.get(key).toString()); } } result.add(tempMap); } } return result; }