問題描述:
在項目中寫了一個方法從數據庫查詢信息,返回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; }
