【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;
                }
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章