Java中Bean轉(zhuǎn)Map問(wèn)題歸納總結(jié)
1. bean轉(zhuǎn)map問(wèn)題概述
Java Bean轉(zhuǎn)map過(guò)程中,一般借助于三方工具進(jìn)行轉(zhuǎn)換,但是第三方工具在轉(zhuǎn)換過(guò)程中會(huì)存在對(duì)象屬性類型或者名稱不一致的問(wèn)題,這里進(jìn)行簡(jiǎn)單梳理幾種方式對(duì)比分析,總結(jié)。
Java Bean對(duì)象轉(zhuǎn)Map,不同工具存在不同的問(wèn)題:
fastjson,gson轉(zhuǎn)換類型不對(duì)。
commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對(duì)。
dubbo,hutool轉(zhuǎn)換類型與名稱都沒(méi)問(wèn)題。(推薦)。
1.fastjson對(duì)象轉(zhuǎn)Map,類型轉(zhuǎn)換錯(cuò)誤,通過(guò)debug可以看到
* String 轉(zhuǎn)換為 String
* Integer 轉(zhuǎn)換為 Integer
* Long 轉(zhuǎn)換為 Integer
* Double 轉(zhuǎn)換為 BigDecimal
* Date 轉(zhuǎn)換為 Long
2.gson對(duì)象轉(zhuǎn)Map,類型轉(zhuǎn)換錯(cuò)誤,通過(guò)debug可以看到
* String 轉(zhuǎn)換為 String
* Integer 轉(zhuǎn)換為 Double
* Long 轉(zhuǎn)換為 Double
* Double 轉(zhuǎn)換為 Double
* Date 轉(zhuǎn)換為 Date
3.commonsbeanutils對(duì)象轉(zhuǎn)Map
* 存在和 cglib 一樣的問(wèn)題,雖然類型沒(méi)問(wèn)題,但是屬性名還是不對(duì)。
* 名稱aDouble 轉(zhuǎn)換為 ADouble,等等
4.cglib對(duì)象轉(zhuǎn)Map
* 存在和 commonsbeanutils 一樣的問(wèn)題,雖然類型沒(méi)問(wèn)題,但是屬性名還是不對(duì)。
* 名稱aDouble 轉(zhuǎn)換為 ADouble,等等
5.hutool對(duì)象轉(zhuǎn)Map
* 類型與名稱 都沒(méi)問(wèn)題
6.dubboBeanToMap對(duì)象轉(zhuǎn)Map
* 類型與名稱 都沒(méi)問(wèn)題
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 實(shí)現(xiàn)驗(yàn)證
MockObject
package com.zrj.tools.framework.entity; import lombok.Data; import java.util.Date; /** * 類型轉(zhuǎn)換對(duì)象 * * @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對(duì)象轉(zhuǎn)Map,不同工具存在不同的問(wèn)題 * fastjson,gson轉(zhuǎn)換類型不對(duì) * commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對(duì) * dubbo,hutool轉(zhuǎn)換類型與名稱都沒(méi)問(wè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對(duì)象轉(zhuǎn)Map * 類型與名稱 都沒(méi)問(wèn)題 */ 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對(duì)象轉(zhuǎn)Map * 類型與名稱 都沒(méi)問(wèn)題 */ private static void hutoolBeanToMap(MockObject mockObject) { Map<String, Object> beanMap = BeanUtil.beanToMap(mockObject); System.out.println("【hutoolBeanToMap】 bean to map:" + beanMap); } /** * gson對(duì)象轉(zhuǎn)Map,類型轉(zhuǎn)換錯(cuò)誤,通過(guò)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對(duì)象轉(zhuǎn)Map * 存在和 commonsbeanutils 一樣的問(wèn)題,雖然類型沒(méi)問(wèn)題,但是屬性名還是不對(duì)。 * 名稱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對(duì)象轉(zhuǎn)Map * 存在和 cglib 一樣的問(wèn)題,雖然類型沒(méi)問(wèn)題,但是屬性名還是不對(duì)。 * 名稱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對(duì)象轉(zhuǎn)Map,類型轉(zhuǎn)換錯(cuò)誤,通過(guò)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對(duì)象轉(zhuǎn)Map,不同工具存在不同的問(wèn)題
1.fastjson,gson轉(zhuǎn)換類型不對(duì)
2.commonsbeanutils,cglib,轉(zhuǎn)換的屬性名稱不對(duì)
3.dubbo,hutool轉(zhuǎn)換類型與名稱都沒(méi)問(wèn)題。(推薦)
補(bǔ)充知識(shí):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問(wèn)題歸納總結(jié)的文章就介紹到這了,更多相關(guān)Java Bean轉(zhuǎn)Map問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決
這篇文章主要介紹了Java在web頁(yè)面上的編碼解碼處理及中文URL亂碼解決,文中所介紹的兩種使用過(guò)濾器解決中文鏈接亂碼的方法非常有效,需要的朋友可以參考下2016-02-02利用Java寫一個(gè)學(xué)生管理系統(tǒng)
今天這篇文章就給給大家分享利用Java寫一個(gè)學(xué)生管理系統(tǒng)吧,先寫一個(gè)簡(jiǎn)單的用List來(lái)實(shí)現(xiàn)學(xué)生管理系統(tǒng):2021-09-09Springmvc工程跳轉(zhuǎn)controller無(wú)效的解決
這篇文章主要介紹了Springmvc工程跳轉(zhuǎn)controller無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Springboot整合Redis實(shí)現(xiàn)超賣問(wèn)題還原和流程分析(分布式鎖)
最近在研究超賣的項(xiàng)目,寫一段簡(jiǎn)單正常的超賣邏輯代碼,多個(gè)用戶同時(shí)操作同一段數(shù)據(jù)出現(xiàn)問(wèn)題,糾結(jié)該如何處理呢?下面小編給大家?guī)?lái)了Springboot整合Redis實(shí)現(xiàn)超賣問(wèn)題還原和流程分析,感興趣的朋友一起看看吧2021-10-10hibernate 命名查詢?nèi)绾螌?shí)現(xiàn)
Hibernate允許在映射文件中定義字符串形式的查詢語(yǔ)句,這種查詢方式成為命名查詢,需要的朋友可以參考下2012-11-11springBoot集成shiro實(shí)現(xiàn)權(quán)限刷新
在SpringBoot項(xiàng)目中集成Shiro進(jìn)行權(quán)限管理,包括基礎(chǔ)配置引入依賴、創(chuàng)建Shiro配置類以及用戶認(rèn)證與授權(quán)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-11-11SpringBoot去除參數(shù)前后空格和XSS過(guò)濾
本文主要介紹了SpringBoot去除參數(shù)前后空格和XSS過(guò)濾,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Java MongoDB實(shí)現(xiàn)REST過(guò)程解析
這篇文章主要介紹了Java MongoDB實(shí)現(xiàn)REST過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08