1. 程式人生 > >Java物件轉換為JSON

Java物件轉換為JSON


import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
/**
 * Object 轉換為json字串
 * version:1.0
 * @author root
 *
 */
public class JSONUtil
{ /** * 物件轉換為json。 * 1、得到object物件的類物件class * 2、通過反射獲得類的全部例項域,建立一個Stringbuffer,用來儲存解析後的字串。 * 3、迴圈遍歷例項域陣列,並判斷其中是否有List型別、Set型別、Map型別、陣列或者普通物件 * 4、如果是複雜型別就通過遞迴分析,直至是普通物件,然後將其解析成字串,拼接在一起 * @param obj * @return */ public static String obj2Json(Object obj){ Class clazz = obj.getClass();
Field[] fields=clazz.getDeclaredFields(); StringBuffer sb = new StringBuffer(); sb.append("{"); if (fields.length>0){ for (Field f:fields){ f.setAccessible(true); try { if(f.getType()==List.class||f.getType
()==Set.class){ StringBuffer s = new StringBuffer(); s.append(foreachListAndSet(f.getName(),f.get(obj))); sb.append(s); }else if(f.getType()==Map.class){ StringBuffer s = new StringBuffer(); s.append(",\""+f.getName()+"\":"); s.append(analysisMap(f,obj)); sb.append(s); }else if(Pattern.matches("^\\[.*", f.getType().getName())){ List list = new ArrayList<>(); for(int i=0;i<Array.getLength(f.get(obj));i++){ list.add(Array.get(f.get(obj), i)); } StringBuffer s = new StringBuffer(); s.append(foreachListAndSet(f.getName(),list)); sb.append(s); }else{ Object v = f.get(obj); sb.append(",\""+f.getName()+"\":\""+v+"\""); } } catch (IllegalAccessException e) { e.printStackTrace(); } } sb.append("}"); } sb.deleteCharAt(1); String json = sb.toString(); return json; } private static StringBuffer analysisMap(Field f,Object obj) throws IllegalArgumentException, IllegalAccessException{ StringBuffer s = new StringBuffer(); Map<?, ?> map = (Map<?, ?>)(f.get(obj)); s.append(foreachMap(f.getName(), map)); return s; } private static StringBuffer foreachMap(Object key,Object value){ StringBuffer s = new StringBuffer(); s.append("{"); Map<?, ?> map = (Map<?, ?>)value; map.forEach((k,v)->{ if(Pattern.matches("^\\[.*", v.getClass().getName())){ List list = new ArrayList<>(); for(int i=0;i<Array.getLength(v);i++){ list.add(Array.get(v, i)); } s.append(foreachListAndSet(k,list)); }else{ switch(v.getClass().getName()){ case "java.lang.Long": case "java.lang.Integer": case "java.lang.Byte": case "java.lang.Short": case "java.lang.Double": case "java.lang.Float": case "java.lang.Boolean": case "java.lang.Character": s.append(",\""+k+"\":\""+v+"\""); break; case "java.util.HashSet": case "java.util.ArrayList": s.append(foreachListAndSet(k,v)); break; case "java.util.Map": s.append(foreachMap(k,v)); break; default: String listObject = JSONUtil.obj2Json(v); s.append(",\""+k+"\":"+listObject); } } }); s.deleteCharAt(1); s.append("}"); return s; } private static StringBuffer foreachListAndSet(Object k,Object v){ Collection<?> coll = (Collection<?>)v; StringBuffer ss = new StringBuffer(); coll.forEach(action->{ if(Pattern.matches("^\\[.*", action.getClass().getName())){ List list = new ArrayList<>(); for(int i=0;i<Array.getLength(action);i++){ list.add(Array.get(action, i)); } ss.append(foreachListAndSet("",list)); }else{ switch(action.getClass().getName()){ case "java.lang.Long": case "java.lang.Integer": case "java.lang.Byte": case "java.lang.Short": case "java.lang.Double": case "java.lang.Float": case "java.lang.Boolean": case "java.lang.Character": ss.append(",\""+action+"\""); break; case "java.util.HashSet": case "java.util.ArrayList": ss.append(foreachListAndSet(action.getClass().getName(),action)); break; case "java.util.Map": ss.append(foreachMap(k,v)); break; default: String listObject = JSONUtil.obj2Json(action); ss.append(","+listObject); } } }); ss.deleteCharAt(0); if(k.equals("")){ ss.insert(0, ",["); }else{ ss.insert(0, ",\""+k+"\":["); } ss.append("]"); return ss; } }

測試:自定義資料user物件中包含car物件、陣列、集合

public class User {
	private List<Car> cars=new ArrayList<>();
	private String name;
	
	private Integer age;
	
	private Set<Car> carSet=new HashSet<>();
	
	private List<Number> num=new ArrayList<>();
	
	private Map<String, Object> map = new HashMap<>();
	
	private Object[] numbers={new Car(),new Car(),1,2.3};
	
	private List<Object> als=new ArrayList<>();
	
	private Object[] obj = {new Car(),456,32.5};
	
	//getter and setter methods 略
}

public class Car {
	private String color;
	private Integer num;
}

public class Test {
	public static void main(String[] args) {
		User u = new User();
		Car c1 = new Car();
		Car c2 = new Car();
		Set<Car> carSet = new HashSet<>();
		List<Car> list = new ArrayList<>();
		c1.setColor("red");
		c1.setNum(1);
		c2.setColor("black");
		c2.setNum(2);
		carSet.add(c1);
		carSet.add(c2);
		list.add(c1);
		list.add(c2);
		u.setAge(20);
		u.setName("zhangsan");
		u.setCars(new LinkedList<Car>());
		u.getCars().add(c1);
		u.getCars().add(c2);
		u.getNum().add(1);
		u.getNum().add(2);
		u.getNum().add(3.678);
		u.getNum().add(4);
		u.getCarSet().add(c1);
		u.getCarSet().add(c2);
		u.getMap().put("car1", c1);
		u.getMap().put("car2",carSet);
		u.getMap().put("car3", list);
		Object[] objs={new Car(),123,4.54};
		u.getMap().put("objs", objs);
		u.getAls().add(u.getObj());
		int lt1 = LocalTime.now().getNano();
		String json = JSONUtil.obj2Json(u);
		int lt2 = LocalTime.now().getNano();
		System.out.println(lt2-lt1);
		System.out.println(json);
	}
}

測試結果:

{
	"cars": [{
		"color": "red",
		"num": "1"
	}, {
		"color": "black",
		"num": "2"
	}],
	"name": "zhangsan",
	"age": "20",
	"carSet": [{
		"color": "red",
		"num": "1"
	}, {
		"color": "black",
		"num": "2"
	}],
	"num": ["1", "2", "3.678", "4"],
	"map": {
		"car2": [{
			"color": "red",
			"num": "1"
		}, {
			"color": "black",
			"num": "2"
		}],
		"car3": [{
			"color": "red",
			"num": "1"
		}, {
			"color": "black",
			"num": "2"
		}],
		"car1": {
			"color": "red",
			"num": "1"
		},
		"objs": [{
			"color": "null",
			"num": "null"
		}, "123", "4.54"]
	},
	"numbers": [{
		"color": "null",
		"num": "null"
	}, {
		"color": "null",
		"num": "null"
	}, "1", "2.3"],
	"als": [
		[{
			"color": "null",
			"num": "null"
		}, "456", "32.5"]
	],
	"obj": [{
		"color": "null",
		"num": "null"
	}, "456", "32.5"]
}