--- title: Map 转对象 order: 2 category: - 指南 description: MapStructPlus Map转为对象 map convert to class --- MapStructPlus 提供了更加强大的 `Map` 转对象的功能。 ::: warning MapStructPlus 1.4.0 及以后版本,不再内置 [Hutool](https://hutool.cn) 框架,如果需要用到该功能时,需要额外引入 `hutool-core` 依赖。 ::: ## 使用 ### 添加依赖 > 1.4.0 及以后的版本需要添加该依赖,1.4.0之前的版本内置 hutool,不需要额外添加。 ```xml cn.hutool hutool-core ${hutool.version} ``` ### 添加注解 **当想要自动生成 `Map` 转为目标类的接口及实现类时,只需要在目标类上添加 `@AutoMapMapper` 注解**。 ## 支持的 value 类型 - `String` - `BigDecimal` - `BigInteger` - `Integer` - `Long` - `Double` - `Boolean` - `Date` - `LocalDateTime` - `LocalDate` - `LocalTime` - `URI` - `URL` - `Calendar` - `Currency` - `自定义类(自定义类也需要增加 @AutoMapMapper 注解)` ## 转换逻辑 **针对目标类中的一个属性,首先会判断 `Map` 中是否存在该键,如果存在的话,首先判断类型,如果相同类型,直接强转,如果不同类型,则会基于 [Hutool](https://hutool.cn/docs/#/core/%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2/%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%B7%A5%E5%85%B7%E7%B1%BB-Convert) 提供的类型转换工具尝试转换为目标类型**。 **且同时支持内部嵌套 `Map` 属性转为内部嵌套的自定义类型属性**。 ## 示例 - 定义两个对象:`MapModelA` 和 `MapModelB` :::: code-group ::: code-group-item MapModelA ```java @AutoMapMapper @Data public class MapModelA { private String str; private int i1; private Long l2; private MapModelB mapModelB; } ``` ::: ::: code-group-item MapModelB ```java @AutoMapMapper @Data public class MapModelB { private Date date; } ``` ::: :::: - 转换测试 ```java @SpringBootTest public class QuickStartTest { @Autowired private Converter converter; @Test public void test() { Map mapModel1 = new HashMap<>(); mapModel1.put("str", "1jkf1ijkj3f"); mapModel1.put("i1", 111); mapModel1.put("l2", 11231); Map mapModel2 = new HashMap<>(); mapModel2.put("date", DateUtil.parse("2023-02-23 01:03:23")); mapModel1.put("mapModelB", mapModel2); final MapModelA mapModelA = converter.convert(mapModel1, MapModelA.class); System.out.println(mapModelA); // MapModelA(str=1jkf1ijkj3f, i1=111, l2=11231, mapModelB=MapModelB(date=2023-02-23 01:03:23)) } } ```