一、序言
JSON 数据的书写格式是:名称/值,因为json具有鲜明的格式,我们常用它来作为数据传输载体。我们在项目中经常会把从数据库得到的数据转成json格式传到前台,接收后进行解析,下面这个是我写的一个工具类,利用反射将对象中的属性,值 并转为json格式。
二、工具类
package test;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.lang.reflect.Field;
import java.util.Map;
public class JsonUtils {
/**
* @param obj
* @return
* @throws InstantiationException
* @throws IllegalAccessException
*/
public static String getJsonString(Object obj) throws InstantiationException, IllegalAccessException {
//如果传入的对象为集合
if (obj instanceof Collection) {
//执行collectionTojson方法将集合类型转为json格式
return collectionTojson(obj);
}
//如果获取的对象类型为一个Map集合
else if (obj instanceof Map) {
//执行mapTojson方法将Map类型转为json格式
return mapTojson(obj);
}
//如果获取的对象类型为普通对象
else{
//执行classTojson方法将普通类型转为json格式
return classTojson(obj);
}
}
/**
* @描述 将集合转为json格式的字符串
* @param obj
* @return
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
private static String collectionTojson(Object obj) throws IllegalArgumentException, IllegalAccessException{
//定义一个StringBuffer类型的字符串
StringBuffer buffer = new StringBuffer();
buffer.append("[");
Class<? extends Object> clazz = obj.getClass();
//获取类中所有的字段
Field[] declaredFields = clazz.getDeclaredFields();
//设置可以获得私有字段的value
Field.setAccessible(declaredFields, true);
//定义全局变量
boolean listf = false;
boolean setf = false;
Set<Object> set = null;
List<Object> list = null;
//遍历获取到的所有字段
for (Field field : declaredFields) {
//getDeclaringClass()同getClasses(),但不局限于public修饰,只要是目标类中声明的内部类和接口均可
String simpleName = clazz.getSimpleName();
//判断获取到的类型
if(simpleName.equals("ArrayList")||simpleName.equals("LinkedList")){
list = (List<Object>) obj;
listf=true;
}
if(simpleName.equals("HashSet")||simpleName.equals("TreeSet")){
set = (Set<Object>) obj;
setf=true;
}
}
//如果获取的对象类型为一个List集合
if(listf == true){
return listTojson(buffer, list).toString();
}
//如果获取的对象类型为一个Set集合
if(setf == true){
buffer = setTojson(set, buffer);
}
buffer.append("]");
return buffer.toString();
}
/**
* 描述 将基本类转为json格式
* @param obj
* @return
*/
private static String classTojson(Object obj){
//通过反射获取到类
Class<? extends Object> clazz = obj.getClass();
//获取类中所有的字段
Field[] fields = clazz.getDeclaredFields();
StringBuffer buffer = new StringBuffer();
buffer.append("[{");
//设置setAccessible方法能获取到类中的私有属性和方法
Field.setAccessible(fields, true);
//遍历所有的方法和属性
for (Field field : fields) {
try {
Object object = field.get(obj);
//获取到该属性对应类型名称
String fieldName = field.getType().getSimpleName();
//如果该属性的值为空
if(object == null){
//根据类型判断追加的值
if(fieldName.equals("String"))
{
buffer.append("\""+field.getName()+"\":\"\",");
}
else if(fieldName.equals("Boolean")||fieldName.equals("Integer")||fieldName.equals("Double")||fieldName.equals("Float")||fieldName.equals("Long")){
buffer.append("\""+field.getName()+"\":0,");
}
else{
buffer.append("\""+field.getName()+"\":null,");
}
}
else{
//获取到该属性的值对应的类
Class<? extends Object> fieldclass = object.getClass();
String simpleName = fieldclass.getSimpleName();
if(simpleName.equals("String")){
buffer.append("\""+field.getName()+"\":\""+field.get(obj)+"\",");
}
else if(simpleName.equals("Boolean")||simpleName.equals("Integer")||simpleName.equals("Double")||simpleName.equals("Float")||simpleName.equals("Long")){