0


Java Bean转Map问题总结

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

packagecom.zrj.tools.framework.entity;importlombok.Data;importjava.util.Date;/**
 * 类型转换对象
 *
 * @author zrj
 * @since 2023/1/8
 **/@DatapublicclassMockObject{privateLong id;privateString aString;privateInteger aInteger;privateLong aLong;privateDouble aDouble;privateDate aDate;}

BeanToMapUtils

packagecom.zrj.tools.framework.utils;importcn.hutool.core.bean.BeanUtil;importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.TypeReference;importcom.google.gson.Gson;importcom.zrj.tools.framework.entity.MockObject;importorg.apache.commons.beanutils.BeanMap;importorg.apache.dubbo.common.utils.PojoUtils;importjava.util.Date;importjava.util.Map;/**
 * Java Bean对象转Map,不同工具存在不同的问题
 * fastjson,gson转换类型不对
 * commonsbeanutils,cglib,转换的属性名称不对
 * dubbo,hutool转换类型与名称都没问题
 *
 * @author zrj
 * @since 2023/1/8
 **/publicclassBeanToMapUtils{publicstaticvoidmain(String[] args){MockObject mockObject =newMockObject();
        mockObject.setAString("jerry");
        mockObject.setAInteger(1);
        mockObject.setALong(2L);
        mockObject.setADate(newDate());
        mockObject.setADouble(3.4D);fastJsonBeanToMap(mockObject);commonsbeanutilsBeanToMap(mockObject);cglibBeanToMap(mockObject);hutoolBeanToMap(mockObject);gSonBeanToMap(mockObject);dubboBeanToMap(mockObject);}/**
     * dubboBeanToMap对象转Map
     * 类型与名称 都没问题
     */privatestaticvoiddubboBeanToMap(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
     * 类型与名称 都没问题
     */privatestaticvoidhutoolBeanToMap(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
     */privatestaticvoidgSonBeanToMap(MockObject mockObject){Gson gson =newGson();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,等等
     */privatestaticvoidcglibBeanToMap(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=nullSystem.out.println(beanMap.get("aDouble"));System.out.println(beanMap.get("ADouble"));}/**
     * commonsbeanutils对象转Map
     * 存在和 cglib 一样的问题,虽然类型没问题,但是属性名还是不对。
     * 名称aDouble 转换为 ADouble,等等
     */privatestaticvoidcommonsbeanutilsBeanToMap(MockObject mockObject){BeanMap beanMap =newBeanMap(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=nullSystem.out.println(beanMap.get("aDouble"));System.out.println(beanMap.get("ADouble"));}/**
     * fastjson对象转Map,类型转换错误,通过debug可以看到
     * String 转换为 String
     * Integer 转换为 Integer
     * Long 转换为 Integer
     * Double 转换为 BigDecimal
     * Date 转换为 Long
     */privatestaticvoidfastJsonBeanToMap(MockObject mockObject){String json =JSON.toJSONString(mockObject);Map<String,Object> map =JSON.parseObject(json,newTypeReference<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转换类型与名称都没问题。(推荐)

标签: java dubbo spring

本文转载自: https://blog.csdn.net/m0_37583655/article/details/128602648
版权归原作者 靖节先生 所有, 如有侵权,请联系我们删除。

“Java Bean转Map问题总结”的评论:

还没有评论