文章目录
前言
hutool的中有方法
BeanUtil.beanToMap()
可以实现,但在实际应用过程中发现,如果要转换的对象中存在List类型的话,集合中的对象是不会转化为下划线格式的。本方法是为了解决这个问题。
BeanUtil.beanToMap()
staticMap<String,Object>beanToMap(Object bean,Map<String,Object> targetMap,boolean isToUnderlineCase,boolean ignoreNullValue)
一、Hutool
Hutool官网
二、代码
1.依赖包
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.5</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version><scope>provided</scope></dependency>
2.BeanMapUtils.class
@Slf4jpublicclassBeanMapUtils{/**
* 将对象装换为map,支持驼峰命名转下划线
* 支持hutool的@Alias注解
* @param bean 要转换的类
* @param isUnderscore 是否转成蛇形命名
* @return
*/publicstaticMap<String,Object>bean2Map(Object bean,boolean isUnderscore){Map<String,Object> map;if(isUnderscore){String s =JSONUtil.toJsonStr(bean);
bean =JSONUtil.parseObj(s);try{
map =formatKey((JSONObject) bean,false);}catch(Exception e){
log.error("bean2Map 对象装换为map出现错误!!!e:", e);thrownewCalcBusinessException("公共类错误");}}else{
map =BeanUtil.beanToMap(bean,false,false);}return map;}/**
* 转换为驼峰格式/转换为下划线方式
*
* @param json 等待转换的方法
* @param upper 首字母大写或者小写
* @return 转换后的
*/publicstaticJSONObjectformatKey(finalJSONObject json,boolean upper){JSONObject real =newJSONObject();for(String it : json.keySet()){Object objR = json.get(it);// 转换为驼峰格式String key =StrUtil.toUnderlineCase(it);// 首字母大写或者小写
key = upper ?StrUtil.upperFirst(key):StrUtil.lowerFirst(key);if(objR instanceofJSONObject){
real.set(key,formatKey((JSONObject) objR, upper));}elseif(objR instanceofJSONArray){JSONArray jsonA =newJSONArray();for(Object objA :(JSONArray) objR){
jsonA.add(formatKey((JSONObject) objA, upper));}
real.set(key, jsonA);}else{
real.set(key, objR);}}return real;}}
3.测试
MainTest.class
publicclassMainTest{/**
* 测试bean2map
*/@Testpublicvoidtest(){BeanTest beanTest =BeanTest.builder().nameAge("nameage").ageName(BigDecimal.ONE).nameAgeTest("test2").testRest(CollUtil.newArrayList(BeanTest2.builder().nameAgeTest("2222").build())).build();Map<String,Object> map =BeanMapUtils.bean2Map(beanTest,true);Console.log(map);// 结果:{"name_age":"nameage","name_age_test2":"test2","age_name":1,"test_rest2":[{"nameAgeTest":"2222"}]}}}
BeanTest.class
@Data@NoArgsConstructor@AllArgsConstructor@BuilderpublicclassBeanTest{//@Alias("name_age")privateString nameAge;@Alias("name_age_test2")privateString nameAgeTest;//@Alias("age_name")privateBigDecimal ageName;@Alias("test_rest2")privateList<BeanTest2> testRest;privateList<Map<String,BigDecimal>> testMapList;}
BeanTest2.class
@Data@NoArgsConstructor@AllArgsConstructor@BuilderpublicclassBeanTest2{privateString nameAgeTest;privateBigDecimal ageNameTest;}
其他
formatKey()
方法是由网上的方法(原方法)改过来的,但这个方法有点问题,只支持string类型的转换。hutool在使用
JSONUtil.parseObj()
方法时,会将value转为
JSONArray
、
JSONObject
以及
BigDecimal(小数)
、
Integer(整数且在int范围内)
、
Long(整数且大于int范围)
、
Boolean(true or false)
、
String(其他)
。
版权归原作者 童哇童 所有, 如有侵权,请联系我们删除。