背景:因顺丰快递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);
}
}
如有思索不当之处,欢迎指出.