package com.jiuqi.lbsinterface.json; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; public class JSONConvertor2 { private static String CLASS = "class"; private static String DATA = "data"; /** * 默认class名称 */ private static String DefaultClassName = ""; private static String NullClassName = "null"; private static String NullData = "null"; public static JSONObject serializable(Object t) { JSONObject jo = new JSONObject(); try { if (null == t) { jo.put(CLASS, NullClassName); jo.put(DATA, NullData); } else if (t instanceof Class<?>) { jo.put(CLASS, DefaultClassName); jo.put(DATA, ((Class<?>) t).getName()); } else { jo.put(CLASS, t.getClass().getName()); Gson gson = getGson(); jo.put(DATA, gson.toJson(t)); } } catch (JSONException e) { e.printStackTrace(); } return jo; } public static JSONObject serializable(Object t, Type type) { JSONObject jo = new JSONObject(); try { if (null == t) { jo.put(CLASS, NullClassName); jo.put(DATA, NullData); } else if (t instanceof Class<?>) { jo.put(CLASS, DefaultClassName); jo.put(DATA, ((Class<?>) t).getName()); } else { if (null == type || !(type instanceof ParameterizedType)) { throw new RuntimeException(type + ":样式错误!"); } jo.put(CLASS, type); Gson gson = getGson(); jo.put(DATA, gson.toJson(t)); } } catch (JSONException e) { e.printStackTrace(); } return jo; } public static Object unSerializable(Type c, JSONObject json) { Gson gson = getGson(); try { // try { // Class<?> oc = Class.forName(json.getString(CLASS), true, // Thread.currentThread().getContextClassLoader()); // if(!(oc.isAssignableFrom(List.class) || // oc.isAssignableFrom(Map.class))){ // c = oc; // } // } catch (ClassNotFoundException e) { // } String data = json.getString(DATA); String className = json.getString(CLASS); if (NullClassName.equals(className)) { return null; } else if (DefaultClassName.equals(className)) { try { return Class.forName(data, true, Thread.currentThread() .getContextClassLoader()); } catch (ClassNotFoundException e) { e.printStackTrace(); } } else { return gson.fromJson(data, c); } } catch (JsonSyntaxException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } private static Gson getGson() { return new Gson(); } public static Object unAutoSerializable(JSONObject json, Type returnType) { if (null == json) { return null; } try { String className = json.getString(CLASS); String data = json.getString(DATA); if (NullClassName.equals(className)) { return null; } else if (DefaultClassName.equals(className)) { return Class.forName(data, true, Thread.currentThread() .getContextClassLoader()); } else { Gson gson = getGson(); data.length(); // gson.fromJson(data, List<DriverBean>.class); // Object l = gson.fromJson(data, new // TypeToken<List<DriverBean>>(){}.getType()); if (className.equals("java.lang.map") || className.equals("java.util.HashMap") || className.equals("java.util.List") || className.equals("java.util.ArrayList")) { return gson.fromJson(data, returnType); } return gson.fromJson(data, getIType(className)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } public static Object unSerializable(JSONObject json) { if (null == json) { return null; } try { String className = json.getString(CLASS); String data = json.getString(DATA); if (NullClassName.equals(className)) { return null; } else if (DefaultClassName.equals(className)) { return Class.forName(data, true, Thread.currentThread() .getContextClassLoader()); } else { Gson gson = getGson(); data.length(); // gson.fromJson(data, List<DriverBean>.class); // Object l = gson.fromJson(data, new // TypeToken<List<DriverBean>>(){}.getType()); return gson.fromJson(data, getIType(className)); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } private static Type getIType(String className) throws ClassNotFoundException { ClassLoader contextClassLoader = Thread.currentThread() .getContextClassLoader(); if (className.endsWith(">") && className.contains("<")) { String[] ss = className.split("<"); Class<?> rawType = Class.forName(ss[0], true, contextClassLoader); // if (List.class.isAssignableFrom(rawType)) { rawType = ArrayList.class; } // Type gType = Class.forName(ss[1].substring(0, ss[1].length() - 1), true, contextClassLoader); return $Gson$Types.newParameterizedTypeWithOwner(null, rawType, gType); } return Class.forName(className, true, contextClassLoader); } public static JSONArray serializableArray(Object... objs) { JSONArray array = new JSONArray(); if (null != objs) { for (Object obj : objs) { array.put(serializable(obj)); } } return array; } public static Object[] unSerializableArray(JSONArray array) { Object[] objs = new Object[array.length()]; for (int i = 0; i < array.length(); i++) { try { objs[i] = unSerializable(array.getJSONObject(i)); } catch (JSONException e) { e.printStackTrace(); } } return objs; } public static JsonArrayResult unSerializableArray_Result(JSONArray array) { JsonArrayResult result = new JsonArrayResult(); int length = array.length(); Object[] objs = new Object[length]; Class<?>[] params = new Class<?>[length]; for (int i = 0; i < length; i++) { try { JSONObject json = array.getJSONObject(i); if (null == json) { continue; } try { String className = json.getString(CLASS); String data = json.getString(DATA); if (NullClassName.equals(className)) { // null; } else if (DefaultClassName.equals(className)) { params[i] = Class.class; objs[i] = Class.forName(data, true, Thread .currentThread().getContextClassLoader()); } else { Gson gson = getGson(); Class<?> c = Class.forName(className, true, Thread .currentThread().getContextClassLoader()); params[i] = c; objs[i] = gson.fromJson(data, c); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } catch (JSONException e) { e.printStackTrace(); } } result.setObjs(objs); result.setParamClass(params); return result; } }