在Ajax中当使用服务器传递数据时,有三种方式:自定义数据格式,xml格式,json格式。
自定义格式在数据比较少时使用起来比较方便,xml格式的话我本人是比较推崇的,因为只需要传一个xml流到客户端,客户端可以直接将xml流生成一个DOM对象,JS处理dom对象也比较简单明了。而json格式的数据在JS处理时非常方便,代码看上去也简单易懂,唯一不好的是在服务器端拼接json格式时非常繁琐,要非常细心,否则就很容易出错。所以我就想是不是写一个方法让它帮我自动生成json字符串。而我只需要将数据传过去就可以得到一个字符串。
下面这个类的CreateByReflect()方法,只要你传一个List集合过去,和一个名字,它就会给你生成一个{"JsonName",[{},{}]}格式的字符串
public class CreateJSON {
public String createByReflect(List<?> obj, String JsonName) {
StringBuffer strBuff = new StringBuffer();
// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}
if (obj.size() == 0)
return "{\"" + JsonName + "\":[]}";
// 否则开始构建字符串
strBuff.append("{\"" + JsonName + "\":[");
for (int i = 0; i < obj.size(); i++) {
strBuff.append(createJson(obj.get(i)));
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("]}");
return strBuff.toString();
}
// 根据给定的实体类对象创建JSON对象
private String createJson(Object obj) {
StringBuffer strBuff = new StringBuffer();
strBuff.append("{");
// 得到该对象的类
Class<?> vo = obj.getClass();
// 得到该对象的所有的字段
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.createJson(fieldValue));
}
}
else {
strBuff.append("\"");
strBuff.append(fieldValue.toString());
strBuff.append("\"");
}
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("}");
return strBuff.toString();
}
}
自定义格式在数据比较少时使用起来比较方便,xml格式的话我本人是比较推崇的,因为只需要传一个xml流到客户端,客户端可以直接将xml流生成一个DOM对象,JS处理dom对象也比较简单明了。而json格式的数据在JS处理时非常方便,代码看上去也简单易懂,唯一不好的是在服务器端拼接json格式时非常繁琐,要非常细心,否则就很容易出错。所以我就想是不是写一个方法让它帮我自动生成json字符串。而我只需要将数据传过去就可以得到一个字符串。
下面这个类的CreateByReflect()方法,只要你传一个List集合过去,和一个名字,它就会给你生成一个{"JsonName",[{},{}]}格式的字符串
public class CreateJSON {
public String createByReflect(List<?> obj, String JsonName) {
StringBuffer strBuff = new StringBuffer();
// 如果传过来的数据长度为0则表示没有数据传过来,直接返回一个{"JsonName":[]}
if (obj.size() == 0)
return "{\"" + JsonName + "\":[]}";
// 否则开始构建字符串
strBuff.append("{\"" + JsonName + "\":[");
for (int i = 0; i < obj.size(); i++) {
strBuff.append(createJson(obj.get(i)));
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("]}");
return strBuff.toString();
}
// 根据给定的实体类对象创建JSON对象
private String createJson(Object obj) {
StringBuffer strBuff = new StringBuffer();
strBuff.append("{");
// 得到该对象的类
Class<?> vo = obj.getClass();
// 得到该对象的所有的字段
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.createJson(fieldValue));
}
}
else {
strBuff.append("\"");
strBuff.append(fieldValue.toString());
strBuff.append("\"");
}
strBuff.append(",");
}
strBuff.deleteCharAt(strBuff.length() - 1);
strBuff.append("}");
return strBuff.toString();
}
}