说说如何把一个POJO形式的Bean对象转换为 Map形式

·  阅读 180

一个POJO形式的Bean对象,包含一系列的属性定义以及属性所对应的 get 与 set 方法。因此我们需要使用Java的反射方法 getDeclaredFields()来获取这个对象中的字段列表。因为属性一般被定义为private,所以必须使用getDeclaredFields()方法,这个方法可以得到某个类的所有声明字段,即包括public、private和proteced,但是不包括父类的申明字段1。以下是实现代码:

private Map<String, Object> toMap(Object obj) {

 Map<String, Object> result = new HashMap<>();

 Field[] fields = obj.getClass().getDeclaredFields();

 for (Field field : fields) {

 field.setAccessible(true);

 String key = field.getName();

 Object value;

 try {

 value = field.get(obj);

 } catch (Exception e) {

 log.warn("取不到对象中名为 " + field.getName() + " 的值,将其置为空。", e);

 continue;

 }

 result.put(key, value);

 }

 return result;

}
复制代码

因为是属性被 private 修饰,所以必须使用 setAccessible(true) 方法让其允许访问。

上一段代码并不实用,因为Date类型的属性会被解析为时间戳。

我们可以使用 Jackson 组件,它可以定义Date类型的属性格式。形如:

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

 private Date areaTime;
复制代码

然后再使用 Jackson 的JSON 处理对象ObjectMapper,就可以转换为 Map对象:

Map<String, Object> values =

 objectMapper.readValue(objectMapper.writeValueAsString(paramValues),

 Map.class);
复制代码

这里先把 Bean 对象转换为字符串,然后再转换为 Map对象。ObjectMapper会读取 Bean 属性中的 @JsonFormat 注解,根据定义的格式进行转换。


[1] JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改