軟件測試技術交流羣 : 429183023
今日在工作中整理dubbo接口的時候,有些接口參數類型是JavaBean類型的數據,在整理的時候又想直接將JavaBean參數直接以默認的json格式整理,於是想到如何將javaBean的默認值 直接轉換成爲 Json格式的數據,避免自己手動去拼寫json字符串。(此段代碼還有值得優化的地方,暫時只支持Java基本數據類型的轉換,不支持javaBean中包含其他javaBean對象變量的轉換、也不支持List/Map等類型的轉換,後期有空想辦法優化,大家如果有優化好的代碼也可以拿出來分享)廢話不多說,直接上代碼
package com.up.util.tools;
import com.google.gson.Gson;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* Created by *** on 2017-3-29
* TIME 11:07.
*/
public class JavaBeanToJson {
public static String toJson(Class clazz) throws Exception {
Gson gson = new Gson();
String result = "";
if (clazz.equals(Map.class)) {
result = clazz.getName() + "\t" + gson.toJson(new HashMap<>());
} else {
Object object = clazz.newInstance();
object = getBean(object);
result = clazz.getName() + "\t" + gson.toJson(object);
}
return result;
}
private static <T> Object getBean(T object) throws Exception {
Class<?> classType = object.getClass();
//SqlRowSet srs = jdbcTemplate.queryForRowSet(sql);
Field[] fields = classType.getDeclaredFields();//得到對象中的字段
//每次循環時,重新實例化一個與傳過來的對象類型一樣的對象
T objectCopy = (T) classType.getConstructor(new Class[]{}).newInstance(new Object[]{});
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
String fieldName = field.getName();
Object value = null;
//根據字段類型決定結果集中使用哪種get方法從數據中取到數據
if (field.getType().equals(String.class)) {
value = "";
} else if (field.getType().equals(int.class) || field.getType().equals(Integer.class)) {
value = new Integer(0);
} else if (field.getType().equals(double.class) || field.getType().equals(Double.class)) {
value = new Double(0);
} else if (field.getType().equals(long.class) || field.getType().equals(Long.class)) {
value = new Long(0);
} else if (field.getType().equals(Date.class)) {
value = new Date();
} else if (field.getType().equals(Object.class)) {
value = new Object();
}
// 獲得屬性的首字母並轉換爲大寫,與setXXX對應
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String setMethodName = "set" + firstLetter
+ fieldName.substring(1);
if (fieldName.equals("serialVersionUID")) {
continue;
}
Method setMethod = classType.getMethod(setMethodName,
new Class[]{field.getType()});
setMethod.invoke(objectCopy, new Object[]{value});//調用對象的setXXX方法
}
return objectCopy;
}
}