package com.jiuqi.mobile.nigo.comeclose.json; 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; import com.jiuqi.mobile.nigo.comeclose.manager.ILoadDataHandler; public class JSONConvertor2 { private static final String CLASS = "class"; private static final String DATA = "data"; private static final String HAVJSONCLASS = "havJsonClass"; /** * 默认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; } /** * @param t * @param type * @param havJsonClass 为true表示使用json中的class * @return */ public static JSONObject serializable(Object t, Type type, boolean havJsonClass) { 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(HAVJSONCLASS, havJsonClass); if(type instanceof Class<?>){ jo.put(CLASS, ((Class) type).getName()); }else{ 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 { 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 GsonBuilder().registerTypeAdapter(ILoadDataHandler.class, new LoadHandleListInstanceCreator()).create(); } 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()); boolean havJsonClass = false; if(json.has(HAVJSONCLASS)){ havJsonClass = json.getBoolean(HAVJSONCLASS); } // if(className.equals("java.lang.map")||className.equals("java.util.HashMap")){ // return gson.fromJson(data, returnType); // } if(havJsonClass){ return gson.fromJson(data, getIType(className)); }else{ return gson.fromJson(data, returnType); } } } 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; } }