日期:2014-05-16  浏览次数:20365 次

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>