Json补充
昨天谈到通过一个类的方法构建一个JSON字符串,后来发现昨天写的那个方法局限性很大,因为我只能传一个list对象过去,而且list集合里面的对象必须为实体类对象,因此使用昨天的那个方法很有可能会造成异常,程序的可扩展性也不是很强,所以今天上午花了一个上午的时间对昨天的程序进行了改进,可以说比昨天的代码有了明显的扩展,对任何对象都适用吧,当然本人也没有进行大量的测试,如果出现bug还希望网友们能提出来,本人好进行改进,谢谢!
代码如下:
package com.csu.util;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;public class CreateJSON {public String createObjToJson(Object obj,String JsonName) {StringBuffer strBuff = new StringBuffer();//判断items是不是Map类if(obj instanceof Map<?,?>) {Map myMap = (Map)obj;strBuff.append(this.createMapToJson(myMap, JsonName));}//判断items对象是不是集合类else if(obj instanceof Collection<?>) {Collection<?> coList = (Collection<?>)obj;//直接调用相关方法strBuff.append(this.createByReflect(coList, JsonName));}//判断items对象是不是数组。else if(obj.getClass().isArray()) {strBuff.append(this.createArrayToJson(obj, JsonName));}//否则为普通对象else {strBuff.append(this.createNomalObjToJson(obj, JsonName));}return strBuff.toString();}//如果一个对象不是集合类对象,也不是Map类,也不是数组类型public String createNomalObjToJson(Object obj,String JsonName) {StringBuffer strBuff = new StringBuffer();strBuff.append("{");// 得到该对象的类Class<?> vo = obj.getClass();//判断该对象是否为八个数据类型 如果是基本数据类型则直接输出{JsonName:"vo"}if(vo.isPrimitive() || vo == String.class|| vo == Integer.class || vo == Float.class|| vo == Double.class || vo == Long.class|| vo == Byte.class || vo == Short.class|| vo == Boolean.class|| vo == Character.class) {return "{"" + JsonName + "":"" + vo + ""}";}// 得到该对象的所有的字段Field[] fields = vo.getDeclaredFields();String methodName = null;String fieldName = null;for (int i = 0; i < fields.length; i++) {// 得到字段名fieldName = fields[i].getName();// 得到该字段的数据类型Class<?> fieldType = fields[i].getType();// 得到该字段的get方法的方法名methodName = "get" + fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);Method method = null;Object fieldValue = null;try {method = vo.getMethod(methodName, new Class[] {});fieldValue = method.invoke(obj);} catch (SecurityException e1) {e1.printStackTrace();} catch (NoSuchMethodException e1) {e1.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}// 将字段名加到字符串中去strBuff.append(""");strBuff.append(fieldName);strBuff.append("":");// 判断该字段的数据类型是不是Object类型,是对象类型的话,还得创建该对象的数据,即递归调用本方法if (!fieldType.isPrimitive() && fieldType != String.class&& fieldType != Integer.class && fieldType != Float.class&& fieldType != Double.class && fieldType != Long.class&& fieldType != Byte.class && fieldType != Short.class&& fieldType != Boolean.class&& fieldType != Character.class) {if(fieldValue == null) {strBuff.append("{}");}else {strBuff.append(this.createObjToJson(fieldValue,fieldName));}}else {strBuff.append(""");strBuff.append(fieldValue.toString());strBuff.append(""");}strBuff.append(",");}strBuff.deleteCharAt(strBuff.length() - 1);strBuff.append("}");return strBuff.toString();}//创建一个Map对象的JSON字符串public String createMapToJson(Map obj,String JsonName) {StringBuffer strBuff = new StringBuffer();// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}if (obj.size() == 0)return "{"" + JsonName + "":[]}";// 否则开始构建字符串strBuff.append("{"" + JsonName + "":[");Set<Map.Entry> mapEntry = obj.entrySet();for(Iterator<Map.Entry> it = mapEntry.iterator();it.hasNext();){Map.Entry item = it.next();Object key = item.getKey();String keyName = "{"" + key.toString() + "":";Object value = item.getValue();strBuff.append(keyName);strBuff.append(this.createObjToJson(value, JsonName));strBuff.append("},");}strBuff.deleteCharAt(strBuff.length() - 1);strBuff.append("]}");return strBuff.toString();}//创建一个数组对象的JSON字符串public String createArrayToJson(Object obj,String JsonName) {StringBuffer strBuff = new StringBuffer();// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}if (Array.getLength(obj) == 0)return "{"" + JsonName + "":[]}";// 否则开始构建字符串strBuff.append("{"" + JsonName + "":[");for(int i = 0; i < Array.getLength(obj); i++) {Object item = Array.get(obj, i);strBuff.append(this.createObjToJson(item, JsonName));strBuff.append(",");}strBuff.deleteCharAt(strBuff.length() - 1);strBuff.append("]}");return strBuff.toString();}//创建一个集合类对象的JSON字符串public String createByReflect(Collection<?> obj, String JsonName) {StringBuffer strBuff = new StringBuffer();// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}if (obj.size() == 0)return "{"" + JsonName + "":[]}";// 否则开始构建字符串strBuff.append("{"" + JsonName + "":[");for (Iterator<?> it = obj.iterator(); it.hasNext(); ) {Object item = it.next();strBuff.append(this.createObjToJson(item, JsonName));strBuff.append(",");}strBuff.deleteCharAt(strBuff.length() - 1);strBuff.append("]}");return strBuff.toString();}}