首頁>技術>

這篇文章,記錄瞭如何在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@AllArgsConstructorpublic 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轉換成實體物件如何。

16
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 在NLP中結合文字和數字特徵進行機器學習