Java中Bean轉(zhuǎn)Map問題歸納總結(jié)
1. bean轉(zhuǎn)map問題概述
Java Bean轉(zhuǎn)map過程中,一般借助于三方工具進(jìn)行轉(zhuǎn)換,但是第三方工具在轉(zhuǎn)換過程中會存在對象屬性類型或者名稱不一致的問題,這里進(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ǔ)充知識: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)文章
利用Java寫一個(gè)學(xué)生管理系統(tǒng)
今天這篇文章就給給大家分享利用Java寫一個(gè)學(xué)生管理系統(tǒng)吧,先寫一個(gè)簡單的用List來實(shí)現(xiàn)學(xué)生管理系統(tǒng):2021-09-09
Springmvc工程跳轉(zhuǎn)controller無效的解決
這篇文章主要介紹了Springmvc工程跳轉(zhuǎn)controller無效的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Springboot整合Redis實(shí)現(xiàn)超賣問題還原和流程分析(分布式鎖)
最近在研究超賣的項(xiàng)目,寫一段簡單正常的超賣邏輯代碼,多個(gè)用戶同時(shí)操作同一段數(shù)據(jù)出現(xiàn)問題,糾結(jié)該如何處理呢?下面小編給大家?guī)砹薙pringboot整合Redis實(shí)現(xiàn)超賣問題還原和流程分析,感興趣的朋友一起看看吧2021-10-10
hibernate 命名查詢?nèi)绾螌?shí)現(xiàn)
Hibernate允許在映射文件中定義字符串形式的查詢語句,這種查詢方式成為命名查詢,需要的朋友可以參考下2012-11-11
springBoot集成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-11
Java MongoDB實(shí)現(xiàn)REST過程解析
這篇文章主要介紹了Java MongoDB實(shí)現(xiàn)REST過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08

