通过反射解析json,无需依赖三方
2016-07-22 11:50
561 查看
package com.example.jsontools; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.lang.reflect.TypeVariable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android.util.Log; /** * @author wly * @date 2016-07-22 */ public class JsonUtil { /** * 解析字符串 */ public static String getString(String jsonStr, String key){ if(isEmpty(jsonStr) || isEmpty(key)) return null; try { JSONObject obj = new JSONObject(jsonStr); String content = obj.optString(key); if(isEmpty(content)) //统一将所有的空值状态返回为"" return ""; return content; } catch (JSONException e) { Log.e("JsonUtil", e.getMessage()); } return null; } /** * 无数据或解析异常时返回int最小值 */ public static int getInt(String jsonStr, String key){ if(isEmpty(jsonStr) || isEmpty(key)) return Integer.MIN_VALUE; try { JSONObject obj = new JSONObject(jsonStr); int content = obj.optInt(key); return content; } catch (JSONException e) { return Integer.MIN_VALUE; } } /** * 无数据或解析异常时返回long最小值 */ public static long getLong(String jsonStr, String key){ if(isEmpty(jsonStr) || isEmpty(key)) return Long.MIN_VALUE; try{ JSONObject obj = new JSONObject(jsonStr); long l = obj.optLong(key); return l; } catch (JSONException e){ return Long.MIN_VALUE; } } /** * 无数据或解析异常时返回Double最小值 */ public static double getDouble(String jsonStr, String key){ if(isEmpty(jsonStr) || isEmpty(key)) return Double.MIN_VALUE; try{ JSONObject obj = new JSONObject(jsonStr); double d = obj.optDouble(key); return d; } catch (JSONException e){ return Double.MIN_VALUE; } } /** * 将json转换为List<Bean> */ public static <T> List<T> json2BeanList(String jsonStr, Class<T> clazz){ if(isEmpty(jsonStr)) return null; try{ List<T> beans = new ArrayList<T>(); JSONArray arr = new JSONArray(jsonStr); for(int i = 0; i < arr.length(); i++) beans.add(json2Bean(arr.optJSONObject(i).toString(), clazz)); return beans; } catch (Exception e) { Log.e("JsonUtil", e.getMessage()); } return null; } /** * 将json转换为Bean */ public static <T> T json2Bean(String jsonStr, Class<T> clazz){ if(isEmpty(jsonStr)) return null; try { JSONObject obj = new JSONObject(jsonStr); T bean = json2BeanByAttr(clazz, obj); return bean; } catch (InstantiationException e) { Log.e("JsonUtil", e.getMessage()); } catch (IllegalAccessException e) { // 说明访问到了私有的属性,表示该javaBean是private的 try { JSONObject obj = new JSONObject(jsonStr); T bean = json2BeanByMethod(clazz, obj); return bean; } catch (JSONException e1) { Log.e("JsonUtil", e1.getMessage()); } catch (InstantiationException e1) { Log.e("JsonUtil", e1.getMessage()); } catch (IllegalAccessException e1) { Log.e("JsonUtil", e1.getMessage()); } catch (IllegalArgumentException e1) { Log.e("JsonUtil", e1.getMessage()); } catch (InvocationTargetException e1) { Log.e("JsonUtil", e1.getMessage()); } } catch (JSONException e) { Log.e("JsonUtil", e.getMessage()); } return null; } /** * 当javaBean属性为private修饰时通过set方法设置属性值 */ private static <T> T json2BeanByMethod(Class<T> clazz, JSONObject obj) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{ T bean = clazz.newInstance(); Method[] methods = clazz.getMethods(); Field[] fds = clazz.getDeclaredFields(); for(Field fd : fds){ List<T> datas = null; if(beanContainsCollection(fd)) { JSONArray arr = obj.optJSONArray(fd.getName()); for (int j = 0; j < methods.length; j++) { if(methods[j].getName().equalsIgnoreCase("get" + fd.getName())) { Type fc = fd.getGenericType(); if(fc == null) continue; if(fc instanceof ParameterizedType){ // 如果是泛型参数的类型 ParameterizedType pt = (ParameterizedType) fc; Class<T> genericClazz = (Class<T>) pt.getActualTypeArguments()[0]; // 得到泛型里的class类型对象。 datas = json2BeanList(arr.toString(), genericClazz);; } } } } for (int i = 0; i < methods.length; i++) { if(methods[i].getName().equalsIgnoreCase("set" + fd.getName()))//拼接方法名 if(datas != null && datas.size() > 0) methods[i].invoke(bean, datas);//执行方法 else methods[i].invoke(bean, obj.opt(fd.getName()));//执行方法 } } return bean; } /** * 当javaBean属性为public修饰时直接设置属性值 */ private static <T> T json2BeanByAttr(Class<T> clazz, JSONObject obj) throws InstantiationException, IllegalAccessException{ T bean = clazz.newInstance(); Field[] fds = clazz.getDeclaredFields(); for(Field fd : fds) fd.set(bean, obj.opt(fd.getName()));//设置属性 return bean; } /** * 集合对象转json */ public static <T> String beanList2Json(/*Class<T> bean,*/ List<T> infos){ if(infos == null || infos.size() == 0) return null; StringBuffer buffer = new StringBuffer(); buffer.append("["); for (int i = 0; i < infos.size(); i++) buffer.append(bean2Json((Class<T>) infos.get(i).getClass(), infos.get(i)) + ((i == infos.size() - 1) ? "" : "," )); return buffer.append("]").toString(); } /** * Map<T, T>集合嵌套转换为json */ public static <T> String beanMap2Json(Map<T, T> maps){ if(maps.size() == 0 || maps == null) return null; StringBuffer buffer = new StringBuffer(); // buffer.apped("{"); Set<T> keys = maps.keySet(); for(T key : keys){ if(maps.get(key).getClass().toString().contains("Map")) return "\"" + key + "\":" + beanMap2Json((Map<T, T>)maps.get(key)); else if(maps.get(key).getClass().toString().contains("List")) return "\"" + key + "\":" + beanList2Json((List<T>)maps.get(key)); String bean2Json = bean2Json((Class<T>)maps.get(key).getClass(), maps.get(key)); buffer.append("\"" + key + "\":[{").append(bean2Json.substring(1, bean2Json.length() - 1)).append("}],"); } return buffer.substring(0, buffer.length() - 1); } /** * Map<T, List<T>>集合嵌套转换为json */ public static <T> String beanListMap2Json(/*Class<T> bean, */Map<T, List<T>> maps){ if(maps.size() == 0 || maps == null) return null; StringBuffer buffer = new StringBuffer(); buffer.append("{"); Set<T> keys = maps.keySet(); for(T key : keys) buffer.append("\"" + key + "\":").append(beanList2Json(/*bean, */maps.get(key))).append(","); return buffer.substring(0, buffer.length() - 1) + "}"; } /** * 对象转json */ public static <T> String bean2Json(Class<T> clazz, T info){ try { String json = bean2JsonByAttr(clazz, info); return json; } catch (IllegalAccessException e) { // 说明访问到了私有的属性,表示该javaBean是private的 try { String json = bean2JsonByMethod(/*clazz, */info); return json; } catch (Exception e1) { Log.e("JsonUtil", e1.getMessage()); } } return null; } private static <T> String bean2JsonByAttr(Class<T> clazz, T info) throws IllegalAccessException{ StringBuffer buffer = new StringBuffer(); Field[] fds = clazz.getDeclaredFields(); buffer.append("{"); for(Field fd : fds){ if(beanContainsCollection(/*clazz, */fd/*, info*/)){ String jsonBean = beanType(/*clazz,*/ fd, info); buffer.append(jsonBean + ","); continue; } String name = fd.getName(); Object value = fd.get(info); try{ if(fd.getType().newInstance() instanceof String) buffer.append("\"" + name + "\":\"" + value + "\","); else buffer.append("\"" + name + "\":" + value + ","); } catch (InstantiationException e) { buffer.append("\"" + name + "\":" + value + ","); } } return buffer.substring(0, buffer.length() - 1) + "}"; } private static <T> String bean2JsonByMethod(/*Class<T> clazz, */T info) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{ StringBuffer buffer = new StringBuffer(); Method[] methods = info.getClass().getMethods(); Field[] fds = info.getClass().getDeclaredFields(); buffer.append("{"); for(Field fd : fds){ if(beanContainsCollection(/*clazz, */fd/*, info*/)){ String jsonBean = beanType(/*clazz,*/ fd, info); buffer.append(jsonBean + ","); continue; } for (int i = 0; i < methods.length; i++) { if(methods[i].getName().equalsIgnoreCase("get" + fd.getName())){ Object value = methods[i].invoke(info);//执行方法 String name = fd.getName(); try{ if(fd.getType().newInstance() instanceof String) buffer.append("\"" + name + "\":\"" + value + "\","); else buffer.append("\"" + name + "\":" + value + ","); } catch (InstantiationException e) { buffer.append("\"" + name + "\":" + value + ","); } } } } return buffer.substring(0, buffer.length() - 1) + "}"; } /** * 对象中如果包含有集合<对象>的处理方法 * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InstantiationException */ private static <T> String beanType(/*Class<T> clazz, */Field fd, T info){ try { Object instance = fd.getType().newInstance(); } catch (Exception e) { // 判断该属性是否是集合 if(e.getMessage().contains("Map")) try { return beanMap2Json(/*clazz, */(Map<T, T>)fd.get(info)); } catch (IllegalAccessException e1) { // 被private 修饰,调用get方法获取参数 return beanTypeByMethod(/*clazz, */fd, info, "map"); } catch (IllegalArgumentException e1) { Log.e("JsonUtil", e1.getMessage()); } if(e.getMessage().contains("List")) try { return beanList2Json(/*clazz, */(List<T>)fd.get(info)); } catch (IllegalAccessException e1) { // 被private 修饰,调用get方法获取参数 return beanTypeByMethod(/*clazz, */fd, info, "list"); } catch (IllegalArgumentException e1) { Log.e("JsonUtil", e1.getMessage()); } } // // 判断属性为哪种集合 // if(instance instanceof Map) // return beanListMap2Json(clazz, (Map<T, List<T>>)fd.get(info)); // if(instance instanceof List) // return beanList2Json(clazz, (List<T>)fd.get(info)); return null; } private static <T> String beanTypeByMethod(/*Class<T> clazz, */Field fd, T info, String type) { Method[] methods = info.getClass().getMethods(); for (int i = 0; i < methods.length; i++) { if(methods[i].getName().equalsIgnoreCase("get" + fd.getName())){ try { Object value = methods[i].invoke(info); if(type.equals("list")) return "\"" + fd.getName() + "\":" + beanList2Json(/*clazz, */(List<T>)value); else return beanMap2Json(/*clazz, */(Map<T, T>)value); } catch (IllegalAccessException e2) { Log.e("JsonUtil", e2.getMessage()); } catch (IllegalArgumentException e2) { Log.e("JsonUtil", e2.getMessage()); } catch (InvocationTargetException e2) { Log.e("JsonUtil", e2.getMessage()); } } } return null; } /** * 判断对象中是否包含集合 */ private static <T> boolean beanContainsCollection(/*Class<T> clazz, */Field fd/*, T info*/){ try { Object instance = fd.getType().newInstance(); // 判断该属性是否是集合 // if(instance instanceof Collection || instance instanceof Map) // return true; } catch (Exception e) { // 判断该属性是否是集合 if(e.getMessage().contains("Map") || e.getMessage().contains("List")) return true; } return false; } /** * 验证非空 */ private static boolean isEmpty(String str){ if(str == null || "".equals(str) || "null".equals(str)) return true; return false; } }相对于上一篇博客,这里的方法更为全面一些,新增功能:将Map<T, T> Map<T , List<T>>转换为Json字符串,以及解析json时解析到对象中的List<Bean>的解析,如果有什么问题,请及时指正,欢迎留言
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序