实体类转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);

    }
}

如有思索不当之处,欢迎指出.

猜你喜欢

转载自blog.csdn.net/hunwanjie/article/details/83009794