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();
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值