Spring boot 把对象属性转换成Map

这篇文章,记录了如何在spring boot来开发业务的时候, 把一个Class对象的属性,提取出来,转换成一个Map备用。

 

数据格式转换,是一个非常有用的基本操作。比如用在构造一些方法的时候, 别人如果只支持Map,那你怎么办, 只能转换一下格式呀。

 

Spring boot是个大宝库,啥需求都能满足,今天就来看看Spring beans相关的能力。 我以一个小需求为例,带大家切入日常操作。 不会讲的很全面,但是掌握这一个例子之后,你可以发散思维,做更多的事情。

 

需求场景:把一个Class,转换成Map<String, String>, 请看示例代码, 我们定义一个POJO class

 

package com.example.vo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExampleReq {
    String app = "twitter";
    String ct ="pro";
    String t = "event";
    String tid= "4406";
}

用到了lombok, 这样就不用写Setter, Getter, ToString, 大家可以自己写。

好, Spring-beans 被spring-web所依赖,所以只要你用到了spring-web,那么这个组件会被自动引入, 我们看看示例代码,怎么转换

ExampleReq inReq = new ExampleReq();
Map<String, String> outMap = new HashMap<>();
BeanWrapper obj = PropertyAccessorFactory.forBeanPropertyAccess(inReq);
PropertyDescriptor[] desc = obj.getPropertyDescriptors();
for (PropertyDescriptor ds: desc) {
    Object outStr = obj.getPropertyValue(ds.getName());
    log.info("object type: {}", outStr.getClass().getName());
    String outStrResp = String.valueOf(outStr);
    outMap.put(ds.getName(), outStrResp);
    log.info(outStr.toString());
    log.info(outStrResp);
}

PropertyAccessorFactory.forBeanPropertyAccess 方法,是创建一个BeanWrapper,这个相当于解析工具, 通过反射API,把对象的属性,等信息都拿到,装载备用。

 

你可以把它理解为解析并放到容器里面

 

obj.getPropertyDescriptors() 这个方法是获取所有的属性标签,也就是上面的类的定义里面的, 比如String app;这些。

 

好, 接下来的for 循环,就是解析一个个的属性, getPropertyValue方法是读取属性的值, key怎么取呢? ds.getName就行了, PropertyDescriptor实例,两个方法,分别是获取Name, 获取Value。

 

是不是很容易理解。

 

接下来就看下面的,因为上面的类型是String,所以我们需要用String.valueOf取里面装的String 值。

PropertyValue取出来,是一个Object, 我们不能直接用, 需要确定它的数据类型,然后取值,

 

String.valueOf 就是取String值的意思, 它接受Object参数,返回的是Object 存的String值

 

然后下面我们调用HashMap的put方法,把名为ds.getName的属性放进去,取值是上面写的String.valueOf(outStr)

 

最终获得的outMap就是我们转换后的map了。

 

聪明的读者朋友,既然你已经学会了如何把对象转换成Map,那么接下来,自己尝试做一个练习,把Map转换成实体对象如何。

分类: WEB框架 标签: 发布于: 2020-12-26 19:51:13, 点击数: