1. 程式人生 > >實體類轉map,駝峰屬性名稱轉換成下劃線風格

實體類轉map,駝峰屬性名稱轉換成下劃線風格

 背景:因順豐快遞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);

    }
}

如有思索不當之處,歡迎指出.