昨天谈到通过一个类的方法构建一个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(); } }