Java中Bean转Map问题归纳总结
作者:靖节先生
1. bean转map问题概述
Java Bean转map过程中,一般借助于三方工具进行转换,但是第三方工具在转换过程中会存在对象属性类型或者名称不一致的问题,这里进行简单梳理几种方式对比分析,总结。
Java Bean对象转Map,不同工具存在不同的问题:
fastjson,gson转换类型不对。
commonsbeanutils,cglib,转换的属性名称不对。
dubbo,hutool转换类型与名称都没问题。(推荐)。
1.fastjson对象转Map,类型转换错误,通过debug可以看到
* String 转换为 String
* Integer 转换为 Integer
* Long 转换为 Integer
* Double 转换为 BigDecimal
* Date 转换为 Long
2.gson对象转Map,类型转换错误,通过debug可以看到
* String 转换为 String
* Integer 转换为 Double
* Long 转换为 Double
* Double 转换为 Double
* Date 转换为 Date
3.commonsbeanutils对象转Map
* 存在和 cglib 一样的问题,虽然类型没问题,但是属性名还是不对。
* 名称aDouble 转换为 ADouble,等等
4.cglib对象转Map
* 存在和 commonsbeanutils 一样的问题,虽然类型没问题,但是属性名还是不对。
* 名称aDouble 转换为 ADouble,等等
5.hutool对象转Map
* 类型与名称 都没问题
6.dubboBeanToMap对象转Map
* 类型与名称 都没问题
2. bean转map的6种方式
2.1 环境依赖
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.10</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.72</version> </dependency> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>3.2.12</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>3.0.9</version> </dependency>
2.2 实现验证
MockObject
package com.zrj.tools.framework.entity; import lombok.Data; import java.util.Date; /** * 类型转换对象 * * @author zrj * @since 2023/1/8 **/ @Data public class MockObject { private Long id; private String aString; private Integer aInteger; private Long aLong; private Double aDouble; private Date aDate; }
BeanToMapUtils
package com.zrj.tools.framework.utils; import cn.hutool.core.bean.BeanUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.google.gson.Gson; import com.zrj.tools.framework.entity.MockObject; import org.apache.commons.beanutils.BeanMap; import org.apache.dubbo.common.utils.PojoUtils; import java.util.Date; import java.util.Map; /** * Java Bean对象转Map,不同工具存在不同的问题 * fastjson,gson转换类型不对 * commonsbeanutils,cglib,转换的属性名称不对 * dubbo,hutool转换类型与名称都没问题 * * @author zrj * @since 2023/1/8 **/ public class BeanToMapUtils { public static void main(String[] args) { MockObject mockObject = new MockObject(); mockObject.setAString("jerry"); mockObject.setAInteger(1); mockObject.setALong(2L); mockObject.setADate(new Date()); mockObject.setADouble(3.4D); fastJsonBeanToMap(mockObject); commonsbeanutilsBeanToMap(mockObject); cglibBeanToMap(mockObject); hutoolBeanToMap(mockObject); gSonBeanToMap(mockObject); dubboBeanToMap(mockObject); } /** * dubboBeanToMap对象转Map * 类型与名称 都没问题 */ private static void dubboBeanToMap(MockObject mockObject) { Object beanMap = null; try { beanMap = PojoUtils.generalize(mockObject); } catch (Exception e) { } System.out.println("【cglibBeanToMap】 bean to map:" + beanMap); System.out.println(beanMap); } /** * hutool对象转Map * 类型与名称 都没问题 */ private static void hutoolBeanToMap(MockObject mockObject) { Map<String, Object> beanMap = BeanUtil.beanToMap(mockObject); System.out.println("【hutoolBeanToMap】 bean to map:" + beanMap); } /** * gson对象转Map,类型转换错误,通过debug可以看到 * String 转换为 String * Integer 转换为 Double * Long 转换为 Double * Double 转换为 Double * Date 转换为 Date */ private static void gSonBeanToMap(MockObject mockObject) { Gson gson = new Gson(); Map<String, Object> beanMap = gson.fromJson(gson.toJson(mockObject), Map.class); //【gSonBeanToMap】 bean to map:{aString=jerry, aInteger=1.0, aLong=2.0, aDouble=3.4, aDate=Jan 8, 2023 4:22:17 PM} System.out.println("【gSonBeanToMap】 bean to map:" + beanMap); } /** * cglib对象转Map * 存在和 commonsbeanutils 一样的问题,虽然类型没问题,但是属性名还是不对。 * 名称aDouble 转换为 ADouble,等等 */ private static void cglibBeanToMap(MockObject mockObject) { net.sf.cglib.beans.BeanMap beanMap = net.sf.cglib.beans.BeanMap.create(mockObject); System.out.println("【cglibBeanToMap】 bean to map:" + beanMap); //ADouble=3.4,aDouble=null System.out.println(beanMap.get("aDouble")); System.out.println(beanMap.get("ADouble")); } /** * commonsbeanutils对象转Map * 存在和 cglib 一样的问题,虽然类型没问题,但是属性名还是不对。 * 名称aDouble 转换为 ADouble,等等 */ private static void commonsbeanutilsBeanToMap(MockObject mockObject) { BeanMap beanMap = new BeanMap(mockObject); //【commonsbeanutils】 bean to map:BeanMap<MockObject(id=null, aString=jerry, aInteger=1, aLong=2, aDouble=3.4, aDate=Sun Jan 08 15:29:25 CST 2023)> System.out.println("【commonsbeanutils】 bean to map:" + beanMap); //ADouble=3.4,aDouble=null System.out.println(beanMap.get("aDouble")); System.out.println(beanMap.get("ADouble")); } /** * fastjson对象转Map,类型转换错误,通过debug可以看到 * String 转换为 String * Integer 转换为 Integer * Long 转换为 Integer * Double 转换为 BigDecimal * Date 转换为 Long */ private static void fastJsonBeanToMap(MockObject mockObject) { String json = JSON.toJSONString(mockObject); Map<String, Object> map = JSON.parseObject(json, new TypeReference<Map<String, Object>>() { }); //【fastjson】 bean to map:{aString=jerry, aLong=2, aDate=1673162965198, aDouble=3.4, aInteger=1} System.out.println("【fastjson】 bean to map:" + map); } }
3. 梳理总结
Java Bean对象转Map,不同工具存在不同的问题
1.fastjson,gson转换类型不对
2.commonsbeanutils,cglib,转换的属性名称不对
3.dubbo,hutool转换类型与名称都没问题。(推荐)
补充知识:Map转Bean
try { PubOrgan organ = new PubOrgan(); Map<String,String> map = new HashMap(); map.put("organId", "1"); map.put("organName", "www.4spaces.org"); BeanUtils.populate(organ, map); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
到此这篇关于Java中Bean转Map问题归纳总结的文章就介绍到这了,更多相关Java Bean转Map问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!