JavaBean類與XML的互換----jdk自帶的JAXBContext
阿新 • • 發佈:2018-12-19
一、簡介
JAXB(Java Architecture for XML Binding) 是一個業界的標準,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML例項文件反向生成Java物件樹的方法,並能將Java物件樹的內容重新寫到XML例項文件。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式繫結到Java表示,從而使得Java開發者在Java應用程式中能方便地結合XML資料和處理函式。
JAXBContext 類提供到 JAXB API 的客戶端入口點。它提供了管理實現 JAXB 繫結框架操作所需的 XML/Java 繫結資訊的抽象,這些操作包括:解組、編組和驗證。 二、重要的類和介面
JAXBContext類,是應用的入口,用於管理XML/Java繫結資訊。
Marshaller介面,將Java物件序列化為XML資料
Unmarshaller介面,將XML資料反序列化為Java物件。
三、JDK中JAXB相關重要的註解
@XmlType,將Java類或列舉型別對映到XML模式型別 @XmlAccessorType(XmlAccessType.FIELD) ,控制欄位或屬性的序列化。FIELD表示JAXB將自動繫結Java類中的每個非靜態的(static)、非瞬態的(由@XmlTransient標註)欄位到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。 @XmlAccessorOrder,控制JAXB 繫結類中屬性和欄位的排序。 @XmlJavaTypeAdapter,使用定製的介面卡(即擴充套件抽象類XmlAdapter並覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。 @XmlElementWrapper ,對於陣列或集合(即包含多個元素的成員變數),生成一個包裝該陣列或集合的XML元素(稱為包裝器)。 @XmlRootElement,將Java類或列舉型別對映到XML元素。 @XmlElement,將Java類的一個屬性對映到與屬性同名的一個XML元素。 @XmlAttribute,將Java類的一個屬性對映到與屬性同名的一個XML屬性。
四、JavaBean與XML字串互轉例項
//******************************基礎類 @Data @XmlRootElement public class Group { private String groupName; private List<User> userList = new ArrayList<User>(); } @Data public class User { private String name; private Date birthDay; private Integer age; } //********************************XML工具類 public class XmlUtils { /** * 功能描述:例項化JAXBContext物件,每種型別只例項化一次。 因為 JAXBContext.newInstance()方法在併發量高時有效能問題。 */ public static ConcurrentHashMap<Class<?> , JAXBContext> map = new ConcurrentHashMap<Class<?> , JAXBContext>() ; /** * 功能描述:獲取JAXBContext例項 */ public static JAXBContext getInstance(Class<?> cla){ try { if(map.contains(cla)){ return map.get(cla); }else{ JAXBContext jaxbContext = JAXBContext.newInstance(cla); map.put(cla , jaxbContext); return jaxbContext; } } catch (JAXBException e) { e.printStackTrace(); } return null; } /** * 功能描述:序列化---JavaBean 轉 Xml字串 */ public static String marshal(Object obj){ String xmlStr = ""; try { JAXBContext jaxbContext = getInstance(obj.getClass()); Marshaller marshaller = jaxbContext.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);//格式化輸出xml //marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);// 是否省略xml頭資訊 marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");//設定編碼格式 StringWriter writer = new StringWriter(); marshaller.marshal(obj , new StreamResult(writer)); xmlStr = writer.toString(); } catch (JAXBException e) { e.printStackTrace(); } return xmlStr.toString(); } /** * 功能描述:反序列化---Xml字串 轉 JavaBean */ public static <T> T unmarshal(String xmlStr , Class<T> cla){ try { JAXBContext jaxbContext = getInstance(cla); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); return (T) unmarshaller.unmarshal(new StringReader(xmlStr)); } catch (JAXBException e) { e.printStackTrace(); } return null; } } //********************************測試類 public class XMLTest1 { public Group init(){ ArrayList<User> users = new ArrayList<>(); for (int i = 0; i < 3; i++) { User user = new User(); user.setName("zhangsan"+i); user.setAge(10+i); user.setBirthDay(new Date()); users.add(user); } Group group = new Group(); group.setGroupName("1組"); group.setUserList(users); return group; } //JavaBean轉XML字串 @Test public void JavaBean2XML() throws JAXBException { Group goup = init(); String xmlStr = XmlUtils.marshal(goup); System.out.println(xmlStr); } /**結果: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <group> <groupName>1組</groupName> <userList> <age>10</age> <birthDay>2018-11-07T16:21:20.558+08:00</birthDay> <name>zhangsan0</name> </userList> <userList> <age>11</age> <birthDay>2018-11-07T16:21:20.558+08:00</birthDay> <name>zhangsan1</name> </userList> </group> */ //XML字串轉JavaBean @Test public void XML2JavaBean() throws JAXBException { Group group = init(); String xmlStr = XmlUtils.marshal(group); Group group2 = XmlUtils.unmarshal(xmlStr, Group.class); System.out.println(group2); } /**結果: *Group(groupName=1組, userList=[User(name=zhangsan0, birthDay=Wed Nov 07 16:23:22 CST 2018, age=10), User(name=zhangsan1, birthDay=Wed Nov 07 16:23:22 CST 2018, age=11)]) / }