临时写出来的,没考虑太多,暂时不支持二维以上数组,Map,set等数据结构(方法应该类似,进行递归创造json即可).
先附上2个测试bean的代码
public class User {
private String username;
private String password;
private int nubmer;
private Date date;
private List arrs;
private Son son;
private Object[] strs;
//省略getter,setter
}
public class Son {
private String name;
private int age;
<pre name="code" class="html">//省略getter,setter
}
package glut.test;
import glut.bean.Son;
import glut.bean.User;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.junit.Test;
public class MyTest {
@Test
public void test() {
List arr = new ArrayList();
arr.add("aaa");
arr.add(456);
Son son = new Son();
Object[] strs = { "strs1", 1211, "strs3" };
User user = new User();
user.setStrs(strs);
user.setSon(son);
user.setUsername("123");
user.setPassword("44");
user.setDate(new Date());
user.setArrs(arr);
user.setNubmer(-99);
System.out.println(createJSON(user));
}
//生成JSON的主要方法
public String createJSON(Object beanInstance) {
String clsPath = beanInstance.getClass().getName();
try {
Class cls = Class.forName(clsPath);
Field[] fs = cls.getDeclaredFields();
Method[] methods = cls.getMethods();
//存放属性
HashSet<String> fields = new HashSet<String>();
//存放属性和对应的get方法
HashMap<String, Method> fieldAndMethod = new HashMap<String, Method>();
//存放最终生成的JSOn
StringBuilder sb = new StringBuilder("{");
//将所有的属性添加到集合中
for (Field f : fs) {
fields.add(f.getName());
}
//找到所有属性的get方法
for (Method m : methods) {
String methodName = m.getName();
if (methodName.startsWith("get")) {
String fieldName = methodName.substring(3, 4).toLowerCase()
+ methodName.substring(4);
if (fields.contains(fieldName)) {
fieldAndMethod.put(fieldName, m);
}
}
}
//从存放属性和对应的get方法中,将属性作为json的key,get方法返回值作为json的
for (String str : fieldAndMethod.keySet()) {
Class returnType = fieldAndMethod.get(str).getReturnType();
Object value = fieldAndMethod.get(str).invoke(beanInstance,
null);
if (value == null) {
sb.append("\"" + str + "\":" + null);
} else {
if (returnType.getSimpleName().equals("String")) {
sb.append("\"" + str + "\":\"" + value + "\"");
} else if (returnType.getSimpleName().equals("Date")) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd");
sb.append("\"" + str + "\":\"" + sdf.format(value)
+ "\"");
} else if (returnType.getSimpleName().contains("List")) {
List temp = (List) value;
StringBuilder tempSb = new StringBuilder("[");
for (Object o : temp) {
if (o instanceof String)
tempSb.append("\"" + o + "\"");
else
tempSb.append(o);
tempSb.append(",");
}
tempSb.deleteCharAt(tempSb.length() - 1);
tempSb.append("]");
sb.append("\"" + str + "\":" + tempSb.toString());
} else if (returnType.getSimpleName().contains("[]")) {
Object[] temp = (Object[]) value;
StringBuilder tempSb = new StringBuilder("[");
for (Object o : temp) {
if (o instanceof String)
tempSb.append("\"" + o + "\"");
else
tempSb.append(o);
tempSb.append(",");
}
tempSb.deleteCharAt(tempSb.length() - 1);
tempSb.append("]");
sb.append("\"" + str + "\":" + tempSb.toString());
} else if (returnType.getSimpleName().equals("int")) {
sb.append("\"" + str + "\":" + value);
} else {
sb.append("\"" + str + "\":" + createJSON(value));
}
}
sb.append(",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("}");
return sb.toString();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "error";
}
}
测试结果:
{"nubmer":-99,"username":"123","arrs":["aaa",456],"strs":["strs1",1211,"strs3"],"son":{"age":0,"name":null},"date":"2015-06-27","password":"44"}
写得比较烂,希望以后有机会再来更新更新~