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"]
}

猜你喜欢

转载自blog.csdn.net/weixin_41698864/article/details/85222853
今日推荐