背景

调用公司影像识别服务接口,返回值都是 Map<String,Object>类型,有的key很多。想把这种 map 结果转为项目中对应的JavaBean如DTO 或者 VO,又不想写很多的 dto.setXxx(map.get("xxx")) 的代码。(注:可以使用fastjson等工具序列化Map,再反序列化为DTO类;本文只关注 MapStruct)

结果

查阅测试了一下,MapStruct 目前(1.3.1.Final 及之前)的版本暂不支持直接将 map 转换成 JavaBean,很早之前有人在 GitHub提了这个 feature(Please add a feature to map from java.util.map to an object #1075),MapStruct 在 1.5.0.Beta1 版本开始提供这项功能,

https://mapstruct.org/news/2021-07-18-mapstruct-1_5_0_Beta1-is-out/

1.5.0.Beta1 起始版本:

官网示例:

1.5.0.Beta1 之前版本:

当然目前版本也可以通过 MapStruct 的一些特性来间接实现 map 转换为 JavaBean,其中一种方式是使用 @Mapping注解中的 expression 表达式指定 map 中的 key 和 JavaBean 字段的映射关系,如下例 map 转换为 Person 对象:

Person

public class Person {private String name;private String hobby;private String school;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}public String getSchool() {return school;}public void setSchool(String school) {this.school = school;}@Overridepublic String toString(){return new StringBuilder().append("{").append("name:").append(name).append(",hobby:").append(hobby).append(",school:").append(school).append("}").toString();}
}

Converter:

@Mapper
public interface Converter {Converter INSTANCE = Mappers.getMapper(Converter.class);@Mappings({@Mapping(expression = "java(map.get(\"name\"))", target = "name"),@Mapping(expression = "java(map.get(\"hobby\"))", target = "hobby"),@Mapping(expression = "java(map.get(\"school\"))", target = "school")})Person mapPerson(Map<String, String> map);
}

Test 类

public class Test {public static void main(String[] args) {Map<String,String> map = new HashMap<String, String>();map.put("name", "小明");map.put("hobby", "足球");map.put("school", "育英小学");Person person = Converter.INSTANCE.mapPerson(map);System.out.println(person);}
}

输出结果:

{name:小明,hobby:足球,school:育英小学}

这种方式虽然可行,但是感觉不理想,还是写了很多 map.get("xxx"), 只不过写到了 @Mapping 注解中了。(不过@Mapping 注解中的 expression 表达式很有意思)

还有一种利用自定义注解的方式,但是感觉太繁琐了,而且很难阅读,更不推荐了,可以参考下面的参考文档。

参考文档

MapStruct 1.5.0.Beta2 Reference Guide

MapStruct: mapping from java.util.Map to Bean? - Stack Overflow

java - Mapstruct: HashMap as source to Object - Stack Overflow

MapStruct Map 转换成对象相关推荐

  1. 自动将Map转换成对象的方法

    实现自动将Map转换成对象,借助第三方工具commons-beanutils-1.8.0.jar+commons-logging.jar实现,需要遵守的规则创建的对象的属性名必须与map的key相同. ...

  2. java web 的map_javaweb开发过程中小工具系列之将Map转换成对象

    在javaweb项目的开发过程中,经常遇到要将一个Map集合转换成一个javabean对象,比如说将页面提交的数据封装到一个javabean中. 此小工具需要两个jar包 1:commons-bean ...

  3. 将map转换成json字符串

    import java.util.HashMap;import java.util.Map;import net.sf.json.JSONObject;public class Transfer {p ...

  4. vue数组转换成对象

    vue数组转换成对象 const data = [{ key: "alan", value: 12 },{ key: "mike", value: 18 } ] ...

  5. java 把map转换成json_map转换成JSON的3种方法

    1 json-lib net.sf.json-lib json-lib 2.4 jdk15 import java.util.HashMap; import java.util.Map; import ...

  6. php把数组转换成对象,php怎么将数组转换成对象

    echoecho() 函数输出一个或多个字符串.注释:echo() 函数实际不是一个函数,所以您不必对它使用括号.然而,如果您想要传多于一个参数给 echo(),使用括号将会生成解析错误.print ...

  7. java xml文件内容替换_java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.java importjava.io.FileInputStream;importjava.io.FileWriter;impo ...

  8. java中把map转换成list

    private String key;     private String value;          //把map转换成list的公共方法     public static List map ...

  9. java xml 字符串转对象_java读取xml文件并转换成对象,并进行修改

    1.首先要写工具类,处理读取和写入xml文件使用的工具.XMLUtil.java import java.io.FileInputStream; import java.io.FileWriter; ...

最新文章

  1. 石家庄的联通破网络,请大家鉴定
  2. OpenJDK 14 性能保持提升,但 OpenJDK 8 仍是最强王者
  3. python下载了怎么打开-下载python后如何启动
  4. 写给Lewis的-URL处理几个关键的函数parse_url、parse_str与http_build_query
  5. cdh 安装_使用Cloudera的CDH部署Hadoop:第三步,安装管理平台和数据库
  6. 闭包总结(2018.03.19)
  7. mysql $gt_mysql变量(用户+系统)
  8. Exchange Server2010部署完后的配置:CA、Outlook Anywhere、OWA域名简写
  9. 单招计算机英语面试口语,单招面试英语自我介绍范文 自我介绍说什么
  10. 专题开发十三:JEECG微云快速开发平台-附录
  11. 【Tensorflow】深度学习实战03——Tensorflow实现AlexNet
  12. Java实训项目1:GUI学生信息管理系统 - 实训概述
  13. 利用计算机诊断ct故障,计算机在CT室工作中的应用及管理
  14. win32开发(图形绘制)
  15. eyoucms内容添加发布
  16. 线性系统与非线性系统
  17. 计算机音乐模式怎么设置,电脑开机时自启QQ音乐APP播放歌曲的功能在哪里设置...
  18. 联想启天电脑教室黑屏硬盘保护系统EDU8.0.2.19修复手记
  19. 保险H5页面、新增模板设计记录
  20. 小糊涂家装预算软件 v8.0 怎么用

热门文章

  1. 血泪 1password
  2. InChIInChi-Key | 国际化合物标识
  3. java stylesheet_Java StyleSheet.getStyleSheets方法代码示例
  4. 信息技术教研组工作总结
  5. C++ notes for beginners
  6. SPSS Modeler C5.0学习笔记
  7. 最小二乘法:least square (平方和最小方法)
  8. 前向渲染(Forward Rendering)和延迟渲染(Deferred Rendering)
  9. 为什么说JDK中的Stack设计是失败的
  10. CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法