问题描述:
在项目中写了一个方法从数据库查询信息,返回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;
}