下面的代碼只是學習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;
}
}
}
}