實體類轉map,駝峰屬性名稱轉換成下劃線風格
阿新 • • 發佈:2019-02-03
背景:因順豐快遞API的HTTP傳輸格式為JSON,且屬性為下劃線風格(如圖二),但JAVA實體類屬性名稱遵循了駝峰規範,故寫了一個工具類,作為轉換。
package com.imall.crm; import com.imall.crm.domain.PrecreateorderData; import com.imall.crm.domain.ShopData; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Bean 》 Map * 駝峰規範屬性轉下劃線 * 支援遞迴轉換,如屬性為JavaBean時 */ public class HumpTransformUnderlineUtils{ private static String compile = "[A-Z]"; private HumpTransformUnderlineUtils(){} public static<T> Map transform(T object){ if(object == null){ return null; } Map<String, Object> map = new HashMap<>(); // 獲取實體類所有屬性,返回Field陣列 Field[] fields = object.getClass().getDeclaredFields(); try { for (int i = 0 ; i < fields.length; i++){ // 屬性名稱 String fieldName = fields[i].getName(); // 轉換駝峰形式屬性名稱成下劃線風格,獲取map的key 例:fieldName 》 field_name String transformFieldName = HumpTransformUnderlineUtils.getTransformFieldName(fieldName); // map 的 value ,屬性的值 Object FieldValue = null; // 將屬性的首字元大寫,方便構造get,set方法 String name = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); // 獲取屬性的型別 String type = fields[i].getGenericType().toString(); Method m = object.getClass().getMethod("get" + name); switch (type){ // 如果有需要,可以仿照下面繼續進行擴充,再增加對其它型別的判斷 case "class java.lang.String": case "class java.lang.Boolean": case "class java.util.Date": case "class java.lang.Integer": case "class java.lang.Long": // 呼叫getter方法獲取屬性值 FieldValue = m.invoke(object); break; default: // 屬性型別為bean,則遞迴 Object obj = m.invoke(object); FieldValue = HumpTransformUnderlineUtils.transform(obj); } map.put(transformFieldName,FieldValue); } }catch (Exception e){ // 系統異常 e.printStackTrace(); } return map; } /** * 轉換風格 駝峰轉下劃線 * @param fieldName 屬性名稱 * @return */ private static String getTransformFieldName(String fieldName) { Pattern humpPattern = Pattern.compile(compile); Matcher matcher = humpPattern.matcher(fieldName); StringBuffer sb = new StringBuffer(); while(matcher.find()){ matcher.appendReplacement(sb, "_"+matcher.group(0).toLowerCase()); } matcher.appendTail(sb); return sb.toString(); } public static void main(String[] args) { String transformFieldName = HumpTransformUnderlineUtils.getTransformFieldName("fieldName"); System.out.println(transformFieldName); PrecreateorderData precreateorderData = new PrecreateorderData(); precreateorderData.setDevId(123456789); precreateorderData.setShopId("9527"); precreateorderData.setUserAddress("北京市朝陽區"); precreateorderData.setWeight(100); precreateorderData.setProductType(2); precreateorderData.setPushTime(Integer.valueOf(System.currentTimeMillis()/ 1000 + "")); precreateorderData.setIsAppoint(0); precreateorderData.setPayType(0); precreateorderData.setCreateDate(new Date()); precreateorderData.setMillisecondTime(System.currentTimeMillis()); ShopData shopData = new ShopData(); shopData.setShopAddress("北京市天安門"); shopData.setShopName("人民大會堂"); shopData.setShopPhone("13800138000"); precreateorderData.setShop(shopData); Map transform = HumpTransformUnderlineUtils.transform(precreateorderData); String jsonString = JsonUtils.toJsonString(transform); // {"shop_id":"9527","product_type":2,"shop":{"shop_phone":"13800138000","shop_name":"人民大會堂","shop_address":"北京市天安門"},"user_address":"北京市朝陽區","weight":100,"is_appoint":0,"pay_type":0,"millisecond_time":1539225333920,"create_date":1539225333920,"push_time":1539225333,"dev_id":123456789} System.out.println(jsonString); } }
如有思索不當之處,歡迎指出.