实体类转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;
 
/**
 * 转换工具类
 * @author 柯文阳
 * @date 2023/7/24
 */
public final class TransformUtils {

    private static final String COMPILE = "[A-Z]";
    private TransformUtils(){}

   /**
     * Bean 》 Map
     * 驼峰规范属性转下划线
     * 支持递归转换,如属性为JavaBean时
     */
    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();

                if ("serialVersionUID".equalsIgnoreCase(fieldName)) {
                    continue;
                }
 
                // 转换驼峰形式属性名称成下划线风格,获取map的key 例:fieldName 》 field_name
                String transformFieldName =  TransformUtils.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 = TransformUtils.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 =  TransformUtils.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 = TransformUtils.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);
 
    }
}

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

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值