Java Bean转Map问题总结

1. bean转map问题概述2. bean转map的6种方式2.1 环境依赖2.2 实现验证

3. 梳理总结

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 环境依赖

cn.hutool

hutool-all

5.8.10

com.google.code.gson

gson

2.8.6

com.alibaba

fastjson

1.2.72

commons-beanutils

commons-beanutils

1.9.4

cglib

cglib-nodep

3.2.12

org.apache.dubbo

dubbo

3.0.9

2.2 实现验证

MockObject

package com.zrj.tools.framework.entity;

import lombok.Data;

import java.util.Date;

/**

* 类型转换对象

*

* @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对象转Map,不同工具存在不同的问题

* fastjson,gson转换类型不对

* commonsbeanutils,cglib,转换的属性名称不对

* dubbo,hutool转换类型与名称都没问题

*

* @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对象转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对象转Map

* 类型与名称 都没问题

*/

private static void hutoolBeanToMap(MockObject mockObject) {

Map 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

*/

private static void gSonBeanToMap(MockObject mockObject) {

Gson gson = new Gson();

Map 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,等等

*/

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对象转Map

* 存在和 cglib 一样的问题,虽然类型没问题,但是属性名还是不对。

* 名称aDouble 转换为 ADouble,等等

*/

private static void commonsbeanutilsBeanToMap(MockObject mockObject) {

BeanMap beanMap = new BeanMap(mockObject);

//【commonsbeanutils】 bean to map:BeanMap

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对象转Map,类型转换错误,通过debug可以看到

* String 转换为 String

* Integer 转换为 Integer

* Long 转换为 Integer

* Double 转换为 BigDecimal

* Date 转换为 Long

*/

private static void fastJsonBeanToMap(MockObject mockObject) {

String json = JSON.toJSONString(mockObject);

Map map = JSON.parseObject(json, new TypeReference>() {

});

//【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转换类型与名称都没问题。(推荐)

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: