【Java反射练习】将对象转成Json字符串

下面的代码只是学习Java反射时练手的一小段代码
使用了递归,但只测试了一层嵌套的解析:Object套Object、Object套List、List套Object、List套List这四种情况
	// 解析单个对象为JSONObject 
    private <T> void setJsonObjectInfo(JSONObject jsonObject, T fromObj) {
    	// 获取Class
        Class tClass =  fromObj.getClass();
        // 获取所有的成员变量
        Field[] fields = tClass.getDeclaredFields();
		// 遍历成员变量
        for (Field field : fields) {
            try {
                // 若:当前变量是不可访问的,则:获取访问权限
                if (!field.isAccessible()) field.setAccessible(true);
                // 获取属性名称
                String key = field.getName();
                // 获取属性描述器:通过属性名称
                PropertyDescriptor pd = new PropertyDescriptor(key, tClass);
                // 获取该属性的get方法:通过属性描述器
                Method rm = pd.getReadMethod();
                // 获取属性值:对fromObj对象调用Method中获取到的get方法(得到属性值)
                Object valueObj = rm.invoke(fromObj);
                // 获取变量的数据类型的class
                Class valueClass = field.getType();
                // 若:当前变量的数据类型是List类型
                if (List.class.isAssignableFrom(valueClass)) {
                	// 则:在当前JSONObject中加入一个新的JSONArray 
                    JSONArray jsonArray = new JSONArray();
                    // 调用另一个解析List的方法
                    this.setJsonArrayInfo(jsonArray, (List) valueObj);
                    // 为JSONObject put一个子JSONArray
                    jsonObject.put(key, jsonArray);
                } else {
                    // 否,则:获取变量的最终简易类型名称
                    String valueSimpleName = valueClass.getSimpleName();
                    switch (valueSimpleName) {
                    	// 若:类型已经是最终类型(不能进一步解析了)
                        case "Byte":
                        case "Short":
                        case "Integer":
                        case "Long":
                        case "Float":
                        case "Double":
                        case "Boolean":
                        case "Char":
                        case "String":
                        	// 则:直接put进JSONObject
                            jsonObject.put(key,valueObj );
                            break;
                        // 若:是其他类型(能够进一步解析,但又不是List)
                        default:
                            // 创建一个子JSONObject
                            JSONObject jsonObject1 = new JSONObject();
                            // 将子jsonobject插入到当前jsonobject中
                            jsonObject.put(key, jsonObject1);
                            // 递归调用
                            this.setJsonObjectInfo(jsonObject1,valueObj );
                            break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

	//解析一个List为JSONArray 
    private <T> void setJsonArrayInfo(JSONArray jsonArray, List<T> fromObj) {
    	// 获取List长度
        int listSize = fromObj.size();
        // 遍历List
        for (int i = 0; i < listSize; i++) {
        	// 取出当前循环对应的元素element
            T object = fromObj.get(i);
			// 获取元素的数据类型
            Class objClass = object.getClass();
            // 若:当前元素依然是一个List
            if (List.class.isAssignableFrom(objClass)) {
            	// 则创建一个子JSONArray 
                JSONArray jsonArray1 = new JSONArray();
                // 并将子JSONArray 加入到当前JSONArray 中
                jsonArray.add(jsonArray1);
                // 递归调用解析List的方法
                this.setJsonArrayInfo(jsonArray1,(List) object);
            }
            else {
                // 否,则:获取变量的最终简易类型名称
                String objSimpleName = objClass.getSimpleName();
                switch (objSimpleName) {
                    case "Byte":
                    case "Short":
                    case "Integer":
                    case "Long":
                    case "Float":
                    case "Double":
                    case "Boolean":
                    case "Char":
                    case "String":
                        jsonArray.add(object);
                        break;
                    default:
                    	// 不是List又不是最终类型(可以进一步解析的对象类型)
                        // 创建一个子JSONObject
                        JSONObject jsonObject = new JSONObject();
                        // 将子jsonobject插入到当前jsonobject中
                        jsonArray.add(jsonObject);
                        // 调用解析Object的方法
                        this.setJsonObjectInfo(jsonObject, object);
                        break;
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章