(六)使用JAXB進行java對象和xml格式之間的相互轉換
JAXB能夠使用Jackson對JAXB注解的支持實現(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,這樣一來可以更好的標志可以轉換為JSON對象的JAVA類。
JAXB(Java Architecture for XML Binding) 是一個業界的標准,是一項可以根據XML Schema產生Java類的技術。該過程中,JAXB也提供了將XML實例文檔反向生成Java對象樹的方法,並能將Java對象樹的內容重新寫到XML實例文檔。從另一方面來講,JAXB提供了快速而簡便的方法將XML模式綁定到Java表示,從而使得Java開發者在Java應用程序中能方便地結合XML數據和處理函數。
JDK中JAXB相關的重要Class和Interface:
JAXBContext類,是應用的入口,用於管理XML/Java綁定信息。
Marshaller接口,將Java對象序列化為XML數據。
Unmarshaller接口,將XML數據反序列化為Java對象。
JDK中JAXB相關的重要Annotation:注解不能使用在字段上,只能使用在getter/setter方法上
@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屬性。
測試代碼:
Student.java:
1 public class Student { 2 private String name; 3 private int age; 4 private String sex; 5 private Date birthday; 6 private String address; 7 private List<Friend> friends; 8 9 public Student() { 10 } 11 12 public Student(String name, int age, String sex, Date birthday, String address) { 13 this.name = name; 14 this.age = age; 15 this.sex = sex; 16 this.birthday = birthday; 17 this.address = address; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public void setName(String name) { 25 this.name = name; 26 } 27 28 //將age字段變成student的一個屬性 29 @XmlAttribute 30 public int getAge() { 31 return age; 32 } 33 34 public void setAge(int age) { 35 this.age = age; 36 } 37 38 public String getSex() { 39 return sex; 40 } 41 42 public void setSex(String sex) { 43 this.sex = sex; 44 } 45 46 public Date getBirthday() { 47 return birthday; 48 } 49 50 public void setBirthday(Date birthday) { 51 this.birthday = birthday; 52 } 53 54 public String getAddress() { 55 return address; 56 } 57 58 public void setAddress(String address) { 59 this.address = address; 60 } 61 62 //指定用<friends>標簽包圍,子標簽為<friend> 63 @XmlElementWrapper(name="friends") 64 @XmlElement(name="friend") 65 public List<Friend> getFriends() { 66 return friends; 67 } 68 69 public void setFriends(List<Friend> friends) { 70 this.friends = friends; 71 } 72 }
Friend.java:
1 public class Friend { 2 3 private String name; 4 private int age; 5 private String address; 6 7 public Friend() { 8 } 9 10 public Friend(String name,int age,String address) { 11 this.name = name; 12 this.age=age; 13 this.address=address; 14 } 15 16 public String getName() { 17 return name; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 @XmlAttribute 25 public int getAge() { 26 return age; 27 } 28 29 public void setAge(int age) { 30 this.age = age; 31 } 32 33 public String getAddress() { 34 return address; 35 } 36 37 public void setAddress(String address) { 38 this.address = address; 39 } 40 }
Students.java:
1 @XmlRootElement(name="students") 2 public class Students { 3 4 private List<Student> students; 5 6 @XmlElement(name="student") 7 public List<Student> getStudents() { 8 return students; 9 } 10 11 public void setStudents(List<Student> students) { 12 this.students = students; 13 } 14 }
JAXBTest.java:
1 public class JAXBTest { 2 3 /** 4 * 將java對象轉換成xml,並用注解指定生成規則,是生成屬性還是生成節點 5 * @throws Exception 6 */ 7 @Test 8 public void testMarshaller() throws Exception{ 9 //獲得轉換的上下文對象 10 JAXBContext context = JAXBContext.newInstance(Students.class); 11 //獲得Marshaller對象 12 Marshaller marshaller = context.createMarshaller(); 13 marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 14 //將java對象進行轉換成xml 15 Students students=new Students(); 16 List<Student> list=new ArrayList<Student>(); 17 //第一個Student 18 Student student1=new Student("張三",19,"男",new Date(),"北京市懷柔區"); 19 List<Friend> friends1=new ArrayList<Friend>(); 20 Friend f11=new Friend("李四",20,"北京市新城區"); 21 friends1.add(f11); 22 Friend f12=new Friend("王五",18,"北京市朝陽區"); 23 friends1.add(f12); 24 student1.setFriends(friends1); 25 list.add(student1); 26 // 第二個Student 27 Student student2 = new Student("李四", 18, "男", new Date(), "北京市懷柔區"); 28 List<Friend> friends2 = new ArrayList<Friend>(); 29 Friend f21 = new Friend("張三", 20, "北京市新城區"); 30 friends2.add(f21); 31 Friend f22 = new Friend("趙六", 18, "北京市朝陽區"); 32 friends2.add(f22); 33 student2.setFriends(friends2); 34 list.add(student2); 35 //添加到Students 36 students.setStudents(list); 37 38 //打印到控制台 39 FileWriter writer=new FileWriter(new File("students.xml")); 40 marshaller.marshal(students, writer); 41 marshaller.marshal(students, System.out); 42 } 43 44 /** 45 * 讀取xml文檔,並將xml文檔反序列化為java對象 46 * @throws Exception 47 */ 48 @Test 49 public void testUnMarshaller() throws Exception{ 50 JAXBContext context = JAXBContext.newInstance(Students.class); 51 Unmarshaller unmarshaller = context.createUnmarshaller(); 52 File f=new File("students.xml"); 53 Students students = (Students) unmarshaller.unmarshal(f); 54 List<Student> list = students.getStudents(); 55 for(Student student:list){ 56 System.out.println("name:"+student.getName()); 57 System.out.println("age:"+student.getAge()); 58 System.out.println("address:"+student.getAddress()); 59 System.out.println("-----------------------"); 60 } 61 } 62 }
輸出保存的students.xml:
1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 2 <students> 3 <student age="19"> 4 <address>北京市懷柔區</address> 5 <birthday>2016-10-15T14:59:45.126+08:00</birthday> 6 <friends> 7 <friend age="20"> 8 <address>北京市新城區</address> 9 <name>李四</name> 10 </friend> 11 <friend age="18"> 12 <address>北京市朝陽區</address> 13 <name>王五</name> 14 </friend> 15 </friends> 16 <name>張三</name> 17 <sex>男</sex> 18 </student> 19 <student age="18"> 20 <address>北京市懷柔區</address> 21 <birthday>2016-10-15T14:59:45.126+08:00</birthday> 22 <friends> 23 <friend age="20"> 24 <address>北京市新城區</address> 25 <name>張三</name> 26 </friend> 27 <friend age="18"> 28 <address>北京市朝陽區</address> 29 <name>趙六</name> 30 </friend> 31 </friends> 32 <name>李四</name> 33 <sex>男</sex> 34 </student> 35 </students>