Java中Bean轉(zhuǎn)Map問題歸納總結(jié)
1. bean轉(zhuǎn)map問題概述
Java Bean轉(zhuǎn)map過程中,一般借助于三方工具進(jìn)行轉(zhuǎn)換,但是第三方工具在轉(zhuǎn)換過程中會(huì)存在對象屬性類型或者名稱不一致的問題,這里進(jì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)換錯(cuò)誤,通過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)換錯(cuò)誤,通過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 實(shí)現(xiàn)驗(yà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)換錯(cuò)誤,通過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)換錯(cuò)誤,通過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)換類型與名稱都沒問題。(推薦)
補(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問題歸納總結(jié)的文章就介紹到這了,更多相關(guān)Java Bean轉(zhuǎn)Map問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Idea中springboot項(xiàng)目的熱部署無法生效問題解決
本文主要介紹了Idea中springboot項(xiàng)目的熱部署無法生效問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
SpringBoot使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)多機(jī)器部署問題(推薦)
這篇文章主要介紹了SpringBoot使用SchedulingConfigurer實(shí)現(xiàn)多個(gè)定時(shí)任務(wù)多機(jī)器部署問題,定時(shí)任務(wù)多機(jī)器部署解決方案,方式一拆分,單獨(dú)拆分出來,單獨(dú)跑一個(gè)應(yīng)用,方式二是基于aop攔截處理(搶占執(zhí)行),只要有一個(gè)執(zhí)行,其它都不執(zhí)行,需要的朋友可以參考下2023-01-01
Java使用JasperReport高效生成Word文檔指南
在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的商業(yè)環(huán)境中,企業(yè)每天都需要處理大量動(dòng)態(tài)文檔生成需求,本文主要為大家介紹了如何使用JasperReport高效生成Word文檔,感興趣的小伙伴可以了解下2025-07-07
Spring中ApplicationContext的拓展功能詳解
這篇文章主要介紹了Spring中ApplicationContext的拓展功能詳解,相對于BeanFactory來說,ApplicationContext除了提供BeanFactory的所有功能外,還有一些其他的功能,主要包括國際化支持、資源訪問、事件傳遞,需要的朋友可以參考下2024-01-01
Service層異常拋到Controller層處理還是直接處理問題分析
這篇文章主要為大家介紹了Service層異常拋到Controller層處理還是直接處理的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
RocketMQ獲取指定消息的實(shí)現(xiàn)方法(源碼)
這篇文章主要給大家介紹了關(guān)于RocketMQ獲取指定消息的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用RocketMQ具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Java實(shí)現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式
這篇文章主要介紹了Java實(shí)現(xiàn)將圖片上傳到webapp路徑下 路徑獲取方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11

