Java map和bean互转常用的方法总结

 更新时间:2023年09月22日 10:40:03   作者:我老菜  
这篇文章主要给大家介绍了关于Java中map和bean互转常用方法的相关资料,平时日常Java开发,经常会涉及到Java Bean和Map之间的类型转换,需要的朋友可以参考下

一、hutool工具类

这个很常用,还支持将蛇形转成驼,如:apply_time 会赋值到applyTime上

        LTDemo ltDemo = BeanUtil.mapToBean(map, LTDemo.class, true, CopyOptions.create());
        Map<String, Object> demoMap = BeanUtil.beanToMap(ltDemo);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println("输出bean -> map : " + demoMap);
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren());
        ltDemo.getChildren().forEach(children -> System.out.println(children.toString()));
        ltDemo.getChildren().forEach(children -> System.out.println(children.getAddress()));

输出原生map: {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:21:01 CST 2023, age=2}], name=张三, apply_time=Fri Mar 03 17:21:01 CST 2023, age=20}
输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[])])
输出bean -> map : {name=张三, age=20, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[])]}
Fri Mar 03 17:21:01 CST 2023
[LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[])]
LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:01 CST 2023, children=[])
上海市

二、fastjson工具类

这个也很常用,也支持将蛇型转成驼峰,

如:apply_time 会赋值到applyTime

        LTDemo ltDemo = JSONObject.parseObject(JSONObject.toJSONString(map), LTDemo.class);
        Map demoMap = JSONObject.parseObject(JSONObject.toJSONString(ltDemo), Map.class);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println("输出bean -> map : " + demoMap);
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren());
        ltDemo.getChildren().forEach(children -> System.out.println(children.toString()));
        ltDemo.getChildren().forEach(children -> System.out.println(children.getAddress()));

输出原生map: {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:21:59 CST 2023, age=2}], name=张三, apply_time=Fri Mar 03 17:21:59 CST 2023, age=20}
输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=Fri Mar 03 17:21:59 CST 2023, children=[LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:59 CST 2023, children=[])])
输出bean -> map : {address=上海市, children=[{"address":"上海市","children":[],"name":"小张","applyTime":1677835319813,"age":2}], name=张三, applyTime=1677835319813, age=20}
Fri Mar 03 17:21:59 CST 2023
[LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:59 CST 2023, children=[])]
LTDemo(name=小张, age=2, address=上海市, applyTime=Fri Mar 03 17:21:59 CST 2023, children=[])
上海市

三、beanutils_BeanUtils工具类 不太好用

嵌套型map,转换会有问题,且不支持蛇型转成驼峰

    //-------------------    beanutils_BeanUtils  -----------------
    //map转java对象
    public static <T> T beanUtils_mapToObject(Map<String, Object> map, Class<T> clazz) throws Exception {
        if (map == null) {
            return null;
        }
        T bean = clazz.newInstance();
        BeanUtils.populate(bean, map);
        return bean;
    }
        LTDemo ltDemo = beanUtils_mapToObject(map, LTDemo.class);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren().get(0).getApplyTime());

输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=Fri Mar 03 17:04:38 CST 2023, children=[{address=上海市, name=小张, applyTime=Fri Mar 03 17:04:38 CST 2023, age=2}])
Fri Mar 03 17:04:38 CST 2023
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.demo.map2bean.LTDemo
    at com.example.demo.map2bean.MapToBean.main(MapToBean.java:73)

四、cglib BeanMap工具类 不太好用

这个也很常用,也支持将蛇形转成驼,如:apply_time 会赋值到applyTime上

import net.sf.cglib.beans.BeanMap;
    // -------------------   cglib BeanMap  -------------------
    //map对象转java
    public static <T> T BeanMapMapToObject(Map<String, Object> map, Class<T> beanClass) throws Exception {
        T object = beanClass.newInstance();
        BeanMap beanMap = BeanMap.create(object);
        beanMap.putAll(map);
        return object;
    }
    //java对象转map
    public static Map<String, Object> BeanMapObjectToMap(Object obj) {
        Map<String, Object> map = Maps.newHashMap();
        if (obj != null) {
            BeanMap beanMap = BeanMap.create(obj);
            for (Object key : beanMap.keySet()) {
                map.put(key + "", beanMap.get(key));
            }
        }
        return map;
    }
        LTDemo ltDemo = beanMapMapToObject(map, LTDemo.class);
        Map demoMap = beanMapObjectToMap(ltDemo);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println("输出bean -> map : " + demoMap);
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren());
        ltDemo.getChildren().forEach(children -> System.out.println(children.toString()));

输出原生map: {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:12:45 CST 2023, age=2}], name=张三, apply_time=Fri Mar 03 17:12:45 CST 2023, age=20}
输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=null, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:12:45 CST 2023, age=2}])
输出bean -> map : {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:12:45 CST 2023, age=2}], name=张三, applyTime=null, age=20}
null
[{address=上海市, name=小张, apply_time=Fri Mar 03 17:12:45 CST 2023, age=2}]
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.demo.map2bean.LTDemo
    at java.util.ArrayList.forEach(ArrayList.java:1259)
    at com.example.demo.map2bean.MapToBean.main(MapToBean.java:75)

五、reflect 反射来玩 不太好玩

    //-------------------   reflect     -------------------
    //map转java对象
    public static Object reflectMapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
        if (map == null) {
            return null;
        }
        Object object = beanClass.newInstance();
        Field[] fields = beanClass.getDeclaredFields();
        for (Field field : fields) {
            int mod = field.getModifiers();
            if (Modifier.isFinal(mod) || Modifier.isStatic(mod)) {
                continue;
            }
            field.setAccessible(true);
            field.set(object, map.get(field.getName()));
        }
        return object;
    }
    //java对象转map
    public static Map<String, Object> reflectObjectToMap(Object obj) throws Exception {
        if (obj == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<String, Object>();
        Field[] declaredFields = obj.getClass().getDeclaredFields();
        for (Field field : declaredFields) {
            field.setAccessible(true);
            map.put(field.getName(), field.get(obj));
        }
        return map;
    }
        LTDemo ltDemo = reflectMapToObject(map,LTDemo.class);
        Map demoMap = reflectObjectToMap(ltDemo);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println("输出bean -> map : " + demoMap);
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren());
        ltDemo.getChildren().forEach(children -> System.out.println(children.toString()));

输出原生map: {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:16:35 CST 2023, age=2}], name=张三, apply_time=Fri Mar 03 17:16:35 CST 2023, age=20}
输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=null, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:16:35 CST 2023, age=2}])
输出bean -> map : {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 17:16:35 CST 2023, age=2}], name=张三, applyTime=null, age=20}
null
[{address=上海市, name=小张, apply_time=Fri Mar 03 17:16:35 CST 2023, age=2}]
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.demo.map2bean.LTDemo
    at java.util.ArrayList.forEach(ArrayList.java:1259)
    at com.example.demo.map2bean.MapToBean.main(MapToBean.java:84)

六、Introspector类 不太好用

这个用起来,只能转换第一层,而且不支持蛇型转驼峰

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
 //----------------- Introspector    ------------------
    //map转java对象
    public static <T> T introspector_mapToObject(Map<String, Object> map, Class<T> clazz) throws Exception {
        if (map == null) {
            return null;
        }
        T bean = clazz.newInstance();
        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            Method setter = property.getWriteMethod();
            if (setter != null) {
                setter.invoke(bean, map.get(property.getName()));
            }
        }
        return bean;
    }
    //java对象转map
    public static Map<String, Object> introspector_objectToMap(Object obj) throws Exception {
        if (obj == null) {
            return null;
        }
        Map<String, Object> map = new HashMap<String, Object>();
        BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
        PropertyDescriptor[] propertyDescriptors = beanInfo
                .getPropertyDescriptors();
        for (PropertyDescriptor property : propertyDescriptors) {
            String key = property.getName();
            if (key.compareToIgnoreCase("class") == 0) {
                continue;
            }
            Method getter = property.getReadMethod();
            Object value = getter != null ? getter.invoke(obj) : null;
            map.put(key, value);
        }
        return map;
    }
        LTDemo ltDemo = introspector_mapToObject(map, LTDemo.class);
        Map demoMap = introspector_objectToMap(ltDemo);
        System.out.println("输出map -> bean: " + ltDemo.toString());
        System.out.println("输出bean -> map : " + demoMap);
        System.out.println(ltDemo.getApplyTime());
        System.out.println(ltDemo.getChildren());
        System.out.println(ltDemo.getChildren().get(0).toString());

输出原生map: {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 16:56:37 CST 2023, age=2}], name=张三, apply_time=Fri Mar 03 16:56:37 CST 2023, age=20}
输出map -> bean: LTDemo(name=张三, age=20, address=上海市, applyTime=null, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 16:56:37 CST 2023, age=2}])
输出bean -> map : {address=上海市, children=[{address=上海市, name=小张, apply_time=Fri Mar 03 16:56:37 CST 2023, age=2}], name=张三, applyTime=null, age=20}
null
[{address=上海市, name=小张, apply_time=Fri Mar 03 16:56:37 CST 2023, age=2}]
Exception in thread "main" java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.demo.map2bean.LTDemo
    at com.example.demo.map2bean.MapToBean.main(MapToBean.java:65)

总结

到此这篇关于Java map和bean互转常用方法的文章就介绍到这了,更多相关Java map和bean互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JAVA实现redis分布式双重加锁的示例代码

    JAVA实现redis分布式双重加锁的示例代码

    在高并发环境下,通过Redis分布式锁实现数据唯一性校验非常关键,为避免用户数据重复,可使用Redis锁或集合数据结构进行前置检查,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Java集合之同步容器详解

    Java集合之同步容器详解

    这篇文章主要为大家详细介绍了Java集合之同步容器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java中常用修饰符的使用方法汇总

    Java中常用修饰符的使用方法汇总

    下面小编就为大家带来一篇Java中常用修饰符的使用方法汇总。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Mybatis-Plus 动态表名的实践

    Mybatis-Plus 动态表名的实践

    本文主要介绍了Mybatis-Plus 动态表名的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-08-08
  • Java基本类型包装类概述与Integer类、Character类用法分析

    Java基本类型包装类概述与Integer类、Character类用法分析

    这篇文章主要介绍了Java基本类型包装类概述与Integer类、Character类用法,结合实例形式分析了java基本数据类型与字符串转换相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Java8中lambda表达式的应用及一些泛型相关知识

    Java8中lambda表达式的应用及一些泛型相关知识

    这篇文章主要介绍了Java8中lambda表达式的应用及一些泛型相关知识的相关资料
    2017-01-01
  • JAVA SFTP文件上传、下载及批量下载实例

    JAVA SFTP文件上传、下载及批量下载实例

    本篇文章主要介绍了JAVA SFTP文件上传、下载及批量下载实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • MySQL MAX(IF())中table.column有值但显示default的解决方案

    MySQL MAX(IF())中table.column有值但显示default的解决方案

    这篇文章主要介绍了MySQL MAX(IF())中table.column有值但显示default的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-11-11
  • ToStringBuilder类的一些心得

    ToStringBuilder类的一些心得

    ToStringBuilder类的一些心得,需要的朋友可以参考一下
    2013-02-02
  • java导出到excel常用的几种方式总结

    java导出到excel常用的几种方式总结

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下,下面这篇文章主要给大家介绍了关于java导出到excel常用的几种方式,需要的朋友可以参考下
    2023-05-05

最新评论