hutool的中有方法BeanUtil.beanToMap()
可以实现,但在实际应用过程中发现,如果要转换的对象中存在List类型的话,集合中的对象是不会转化为下划线格式的。本方法是为了解决这个问题。 BeanUtil.beanToMap()
static Map<String,Object> beanToMap(Object bean, Map<String,Object> targetMap, boolean isToUnderlineCase, boolean ignoreNullValue)
<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>
@Slf4j
public class BeanMapUtils {
/**
* 将对象装换为map,支持驼峰命名转下划线
* 支持hutool的@Alias注解
* @param bean 要转换的类
* @param isUnderscore 是否转成蛇形命名
* @return
*/
public static Map<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);
throw new CalcBusinessException("公共类错误");
}
}else {
map = BeanUtil.beanToMap(bean, false, false);
}
return map;
}
/**
* 转换为驼峰格式/转换为下划线方式
*
* @param json 等待转换的方法
* @param upper 首字母大写或者小写
* @return 转换后的
*/
public static JSONObject formatKey(final JSONObject json, boolean upper) {
JSONObject real = new JSONObject();
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 instanceof JSONObject) {
real.set(key, formatKey((JSONObject) objR, upper));
}else if (objR instanceof JSONArray) {
JSONArray jsonA = new JSONArray();
for (Object objA : (JSONArray) objR) {
jsonA.add(formatKey((JSONObject) objA, upper));
}
real.set(key, jsonA);
}else {
real.set(key, objR);
}
}
return real;
}
}
public class MainTest {
/**
* 测试bean2map
*/
@Test
public void test() {
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"}]}
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BeanTest {
//@Alias("name_age")
private String nameAge;
@Alias("name_age_test2")
private String nameAgeTest;
//@Alias("age_name")
private BigDecimal ageName;
@Alias("test_rest2")
private List<BeanTest2> testRest;
private List<Map<String, BigDecimal>> testMapList;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class BeanTest2 {
private String nameAgeTest;
private BigDecimal ageNameTest;
}
formatKey()
方法是由网上的方法(原方法)改过来的,但这个方法有点问题,只支持string类型的转换。hutool在使用JSONUtil.parseObj()
方法时,会将value转为JSONArray
、JSONObject
以及BigDecimal(小数)
、Integer(整数且在int范围内)
、Long(整数且大于int范围)
、Boolean(true or false)
、String(其他)
。
原网址: 访问
创建于: 2023-05-09 15:55:26
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论