Java中Bean轉(zhuǎn)Map問題歸納總結(jié)
1. bean轉(zhuǎn)map問題概述
Java Bean轉(zhuǎn)map過程中,一般借助于三方工具進行轉(zhuǎn)換,但是第三方工具在轉(zhuǎn)換過程中會存在對象屬性類型或者名稱不一致的問題,這里進行簡單梳理幾種方式對比分析,總結(jié)。
Java Bean對象轉(zhuǎn)Map,不同工具存在不同的問題:
fastjson,gson轉(zhuǎn)換類型不對。
commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對。
dubbo,hutool轉(zhuǎn)換類型與名稱都沒問題。(推薦)。
1.fastjson對象轉(zhuǎn)Map,類型轉(zhuǎn)換錯誤,通過debug可以看到
* String 轉(zhuǎn)換為 String
* Integer 轉(zhuǎn)換為 Integer
* Long 轉(zhuǎn)換為 Integer
* Double 轉(zhuǎn)換為 BigDecimal
* Date 轉(zhuǎn)換為 Long
2.gson對象轉(zhuǎn)Map,類型轉(zhuǎn)換錯誤,通過debug可以看到
* String 轉(zhuǎn)換為 String
* Integer 轉(zhuǎn)換為 Double
* Long 轉(zhuǎn)換為 Double
* Double 轉(zhuǎn)換為 Double
* Date 轉(zhuǎn)換為 Date
3.commonsbeanutils對象轉(zhuǎn)Map
* 存在和 cglib 一樣的問題,雖然類型沒問題,但是屬性名還是不對。
* 名稱aDouble 轉(zhuǎn)換為 ADouble,等等
4.cglib對象轉(zhuǎn)Map
* 存在和 commonsbeanutils 一樣的問題,雖然類型沒問題,但是屬性名還是不對。
* 名稱aDouble 轉(zhuǎn)換為 ADouble,等等
5.hutool對象轉(zhuǎn)Map
* 類型與名稱 都沒問題
6.dubboBeanToMap對象轉(zhuǎn)Map
* 類型與名稱 都沒問題
2. bean轉(zhuǎn)map的6種方式
2.1 環(huán)境依賴
<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 實現(xiàn)驗證
MockObject
package com.zrj.tools.framework.entity; import lombok.Data; import java.util.Date; /** * 類型轉(zhuǎn)換對象 * * @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對象轉(zhuǎn)Map,不同工具存在不同的問題 * fastjson,gson轉(zhuǎn)換類型不對 * commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對 * dubbo,hutool轉(zhuǎn)換類型與名稱都沒問題 * * @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對象轉(zhuǎn)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對象轉(zhuǎn)Map * 類型與名稱 都沒問題 */ private static void hutoolBeanToMap(MockObject mockObject) { Map<String, Object> beanMap = BeanUtil.beanToMap(mockObject); System.out.println("【hutoolBeanToMap】 bean to map:" + beanMap); } /** * gson對象轉(zhuǎn)Map,類型轉(zhuǎn)換錯誤,通過debug可以看到 * String 轉(zhuǎn)換為 String * Integer 轉(zhuǎn)換為 Double * Long 轉(zhuǎn)換為 Double * Double 轉(zhuǎn)換為 Double * Date 轉(zhuǎn)換為 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對象轉(zhuǎn)Map * 存在和 commonsbeanutils 一樣的問題,雖然類型沒問題,但是屬性名還是不對。 * 名稱aDouble 轉(zhuǎn)換為 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對象轉(zhuǎn)Map * 存在和 cglib 一樣的問題,雖然類型沒問題,但是屬性名還是不對。 * 名稱aDouble 轉(zhuǎn)換為 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對象轉(zhuǎn)Map,類型轉(zhuǎn)換錯誤,通過debug可以看到 * String 轉(zhuǎn)換為 String * Integer 轉(zhuǎn)換為 Integer * Long 轉(zhuǎn)換為 Integer * Double 轉(zhuǎn)換為 BigDecimal * Date 轉(zhuǎn)換為 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. 梳理總結(jié)
Java Bean對象轉(zhuǎn)Map,不同工具存在不同的問題
1.fastjson,gson轉(zhuǎn)換類型不對
2.commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對
3.dubbo,hutool轉(zhuǎn)換類型與名稱都沒問題。(推薦)
補充知識:Map轉(zhuǎn)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(); }
到此這篇關(guān)于Java中Bean轉(zhuǎn)Map問題歸納總結(jié)的文章就介紹到這了,更多相關(guān)Java Bean轉(zhuǎn)Map問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springmvc工程跳轉(zhuǎn)controller無效的解決
這篇文章主要介紹了Springmvc工程跳轉(zhuǎn)controller無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot整合Redis實現(xiàn)超賣問題還原和流程分析(分布式鎖)
最近在研究超賣的項目,寫一段簡單正常的超賣邏輯代碼,多個用戶同時操作同一段數(shù)據(jù)出現(xiàn)問題,糾結(jié)該如何處理呢?下面小編給大家?guī)砹薙pringboot整合Redis實現(xiàn)超賣問題還原和流程分析,感興趣的朋友一起看看吧2021-10-10springBoot集成shiro實現(xiàn)權(quán)限刷新
在SpringBoot項目中集成Shiro進行權(quán)限管理,包括基礎(chǔ)配置引入依賴、創(chuàng)建Shiro配置類以及用戶認證與授權(quán)實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-11-11