//TODO 這樣要注意,entity是檔名稱,要換成你自己實體類上的檔名,如:com.greatmap.internet.estate.entity
package com.greatmap.internet.estate.utils;
import com.alibaba.fastjson.JSONObject;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author lxw
* @date 2020/11/30 18:08
*/
public class ObjectToJosn {
public static String Object2JsonAllFiled(Object object){
return JSONObject.toJSONString(getAllFiledName(object));
}
/**
* @param model
* @return
*/
public static Object getAllFiledName(Object model) {
Field[] field = model.getClass().getDeclaredFields(); // 獲取實體類的所有屬性,返回Field陣列
try {
for (int j = 0; j < field.length; j++) { // 遍歷所有屬性
String name = field[j].getName(); // 獲取屬性的名字
name = name.substring(0, 1).toUpperCase() + name.substring(1); // 將屬性的首字元大寫,方便構造get,set方法
String type = field[j].getGenericType().toString(); // 獲取屬性的型別
if (type.equals("class java.lang.String")) { // 如果type是類型別,則前面包含"class ",後面跟類名
Method m = model.getClass().getMethod("get" + name);
String value = (String) m.invoke(model); // 呼叫getter方法獲取屬性值
if (value == null) {
m = model.getClass().getMethod("set" + name, String.class);
m.invoke(model, "");
}
}
if (type.equals("class java.lang.Integer")) {
Method m = model.getClass().getMethod("get" + name);
Integer value = (Integer) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set" + name, Integer.class);
m.invoke(model, 0);
}
}
if (type.equals("class java.lang.Boolean")) {
Method m = model.getClass().getMethod("get" + name);
Boolean value = (Boolean) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set" + name, Boolean.class);
m.invoke(model, false);
}
}
if (type.equals("class java.util.Date")) {
Method m = model.getClass().getMethod("get" + name);
Date value = (Date) m.invoke(model);
if (value == null) {
m = model.getClass().getMethod("set" + name, Date.class);
//格式化日期
m.invoke(model,new Date() );
}
}
if (type.contains("List")) {
Method m = model.getClass().getMethod("get" + name);
List list = (List) m.invoke(model);
if (null == list) {
m = model.getClass().getMethod("set" + name, List.class);
m.invoke(model, new ArrayList<>());
}else {
//如果是集合中只有一部分有值,其他屬於都要顯示
for(int i=0;i<list.size();i++){
getAllFiledName(list.get(i));
}
}
}
//如果是物件,就要遞迴遍歷物件,這裡對接智慧用關鍵字來看,物件陣列不接受
//TODO 這樣要注意,entity是檔名稱,要換成你自己實體類上的檔名,如:com.greatmap.internet.estate.entity
if (type.contains("com.greatmap.internet.estate.entity")&&!type.contains("List")) {
//這裡是遞迴查詢,如果物件相互引用,就會導致死迴圈
Method m = model.getClass().getMethod("get" + name);
Object value = m.invoke(model);
if(null==value){
try {
Object obj= Class.forName(type).newInstance();
getAllFiledName(obj);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}else {
getAllFiledName(value);
}
}
// 如果有需要,可以仿照上面繼續進行擴充,再增加對其它型別的判斷
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return model;
}
public static String getSystemYYYYMMDD(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//設定日期格式
return df.format(new Date());
}
}