說說如何把一個POJO形式的Bean對象轉換爲 Map形式

一個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 ()方法的區別

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章