net.sf.json.JSONObject為我們提供了toBean方法用來轉換為JAVA對象, 功能更為強大, 這里借鑒采用JDK的反射機制, 作為簡單的輔助工具使用, 有些數據類型需要進行轉換, 根據需要進行擴展, 這里可以處理Long和Date類型.
只支持單個JSONObject對象的處理, 對於復雜的JSON對象, 如JSONArray數組, 可考慮先遍歷, 獲取JSONObject后再進行處理.
package common; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import net.sf.json.JSONObject; /** * 輔助處理工具 * */ public class AssistantUtil { private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 把JSON數據轉換成JAVA對象 * description: 函數的目的/功能 */ public static void setJsonObjData(Object obj, JSONObject data, String[] excludes) throws Exception { // 反射獲取所有方法 Method[] methods = obj.getClass().getDeclaredMethods(); if (null != methods) { for (Method m : methods) { String methodName = m.getName(); if (methodName.startsWith("set")) { methodName = methodName.substring(3); // 獲取屬性名稱 methodName = methodName.substring(0, 1).toLowerCase() + methodName.substring(1); if (!methodName.equalsIgnoreCase("class") && !isExistProp(excludes, methodName)) { try { m.invoke(obj, new Object[] { data.get(methodName) }); } catch (IllegalArgumentException e1) { if(m.getParameterTypes()[0].getName().equals("java.lang.Long")){ m.invoke(obj, new Object[] { Long.valueOf(data.get(methodName).toString())}); }else if(m.getParameterTypes()[0].getName().equals("java.util.Date")){ m.invoke(obj, new Object[] {data.containsKey(methodName)? sdf.parse(data.get(methodName).toString()) : null}); } } catch (Exception e) { } } } } } } private static boolean isExistProp(String[] excludes, String prop) { if (null != excludes) { for (String exclude : excludes) { if (prop.equals(exclude)) { return true; } } } return false; } }