https://git.oschina.net/vigiles/CommonJsonUtil
https://github.com/731942771/CommonJsonUtil
这里用到了3个关键方法
Class.forName("类名"),得到类的模板
clazz.getDeclaredFields(),得到全部属性,无论私有公有
clazz.getDeclaredConstructor(参数类型集合),对是类型集合
本例演示的都是类中只有基本数据类型成员的例子,即8个基本数据类型及包装类。有了思路,List、Map也就不难了。
思路就是,每个json字符串的结构都是标准的,按照{"Bean类名":"{Bean属性体}"}这样的,并且每个json串都配对存在Bean实体。
本例实现功能:无论传入怎样的json串,都不用改变解析方法的代码,自动解析封装,返回对应的封装体Bean。这在Android开发中是很实用的功能。
上代码,此代码是在eclipse4javase中实现的,如何用在Android里就不用多说了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
// String String String int String jsonUser = "{\"User\":{\"name\":\"Eminem\", \"address\":\"USA\", \"age\":\"44\"}}"; // String String String int String double String jsonGust = "{\"Gust\":{\"name\":\"Gust\", \"address\":\"UnKnown\", \"age\":\"0\", \"number\":\"13213213213\", \"amount\":\"987654324.0454\"}}"; // String String Boolean String jsonVigi = "{\"Vigiles\":{\"name\":\"崔维友\", \"married\":\"false\"}}"; /** * 一旦上下,此方法不能再有任何修改 * 自动匹配json数据返回对应的bean * @param json json字串 * @return 对应bean封装体 */ public static Object analyze(String json) { if(json == null || "".equals(json)) return null; String beanName = null; // Bean的类名,即JSON串中JSONObject的Key JSONObject jobj = new JSONObject(json); // 用jsonobject封装字串 Iterator<String> keys = jobj.keys(); // 获取全部的key while (keys.hasNext()) { // 遍历key String key = keys.next(); // json串格式固定,得到key beanName = key; break; } if(beanName == null || "".equals(beanName)) return null; try { /** 反射,得到本条json串对应的Bean封装体 */ Class<?> clazz = Class.forName("com.cuiweiyou.analyze." + beanName); /** 反射,得到Bean的全部成员属性 */ Field[] fields = clazz.getDeclaredFields(); // 公有私有属性都拿来 /** 构建Bean实例时用到的参数的类型集 */ Class[] types = new Class[fields.length]; /** 构建Bean实例时用到的参数集 */ Object[] parms = new Object[fields.length]; // json串中bean体对应的数据 JSONObject jcobj = jobj.getJSONObject(beanName); // 提取Bean属性的值 for (int i = 0; i< types.length; i++) { Class<?> type = fields[i].getType(); // 成员属性的类型,String、int、... String fieldName = fields[i].getName(); // 成员属性的名称,name、age、... Object fieldValue = jcobj.get(fieldName); // 根据成员名称,从json中提取对应的值。"北京"、23、... String fieldType = type.getSimpleName(); System.out.println("变量类型:" + fieldType + ",变量名:" + fieldName + ", 变量值:" + fieldValue); types[i] = type; // 判断反射到的类的成员是什么类型。非集合类型的变量都好处理 if("int".equals(type.getSimpleName()) || "Integer".equals(type.getSimpleName())){ parms[i] = Integer.parseInt(fieldValue.toString()); } else if("float".equals(type.getSimpleName()) || "Float".equals(type.getSimpleName())){ parms[i] = Float.parseFloat(fieldValue.toString()); } else if("short".equals(type.getSimpleName()) || "Short".equals(type.getSimpleName())){ parms[i] = Short.parseShort(fieldValue.toString()); } else if("long".equals(type.getSimpleName()) || "Long".equals(type.getSimpleName())){ parms[i] = Long.parseLong(fieldValue.toString()); } else if("double".equals(type.getSimpleName()) || "Double".equals(type.getSimpleName())){ parms[i] = Double.parseDouble(fieldValue.toString()); } else if("boolean".equals(type.getSimpleName()) || "Boolean".equals(type.getSimpleName())){ parms[i] = Boolean.parseBoolean(fieldValue.toString()); } else { parms[i] = fieldValue; } } /** 发射,得到对应数量参数的构造方法 */ Constructor cstor = clazz.getDeclaredConstructor(types); cstor.setAccessible(true);//取消 Java 语言访问安全检查。此时可操作私有成员 /** 反射,通过构造方法创建Bean实例 */ return cstor.newInstance(parms); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } /* Object instance = clazz.newInstance(); // 须显式的有一个无参的默认构造方法 System.out.println("默认构造方法:" + instance.getClass().getSimpleName()); Constructor<?>[] constructors = clazz.getDeclaredConstructors(); // 公有私有无参有参构造方法统统拿到 for (Constructor<?> constructor : constructors) { System.out.println("构造方法参数"); Class<?>[] paramTypes = constructor.getParameterTypes(); for (Class<?> class1 : paramTypes) { System.out.println("构造方法参数类型:" + class1.getSimpleName()); } } Class[] paramTypes = { String.class, String.class, Integer.class };// 构造方法里int参数设为Integer,这里不能自动装拆包 Object[] params = {"Eminem", "USA", 42}; // 方法传入的参数 Constructor con = clazz.getConstructor(paramTypes); //关键 return con.newInstance(params); //目标Bean */ return null; } |
[download id="1767"]
cuiweiyou.com 欢迎各位网友交流。
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/1766.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设