java利用JAXB實現(xiàn)對象和xml互相轉(zhuǎn)換方法與實例詳解
1、JAXB應(yīng)用場景
在使用WebService實現(xiàn)數(shù)據(jù)上傳下載,數(shù)據(jù)查詢時,可以利用JAXB實現(xiàn)java實體類和xml互相轉(zhuǎn)換
2、Demo
2.1 student.java 實體類
包含list(set同理)、map、Teacher、Date 類型的屬性
package jaxb; import java.util.Date; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlType(propOrder={"id","name","age","birthDay","list","teacher","map"}) //指定序列成的xml節(jié)點順序 @XmlAccessorType(value=XmlAccessType.FIELD) //訪問類型改為字段 @XmlRootElement public class Student { @XmlElement private String id; @XmlElement private String name; @XmlElement private int age; @XmlJavaTypeAdapter(value=DateAdapter.class) @XmlElement private Date birthDay; @XmlElement private List<Teacher> list; @XmlElement private Teacher teacher; @XmlJavaTypeAdapter(value=MapAdapter.class) // @XmlElementWrapper(name="role") @XmlElement private Map map; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthDay() { return birthDay; } public void setBirthDay(Date birthDay) { this.birthDay = birthDay; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Teacher getTeacher() { return teacher; } public void setTeacher(Teacher teacher) { this.teacher = teacher; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", birthDay=" + birthDay + ", list=" + list + ", teacher=" + teacher + ", map=" + map + "]"; } }
2.2 Teacher.java類
注意:Teacher 類不包含@XmlRootElement節(jié)點,因為目的是轉(zhuǎn)成一個XML文檔,根節(jié)點只有一個
package jaxb; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlType; @XmlAccessorType(value=XmlAccessType.FIELD) @XmlType(propOrder={"id","name","age"}) public class Teacher { @XmlElement private int id; @XmlElement private String name; @XmlElement private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Teacher(int id, String name, int age) { super(); this.id = id; this.name = name; this.age = age; } public Teacher() { } @Override public String toString() { return "Teacher [id=" + id + ", name=" + name + ", age=" + age + "]"; } }
2.3 DateApdapter.java
自定義時間適配器類
在java實體類序列化xml日期時,需要對時間進行自定義轉(zhuǎn)換,jaxb提供了XmlAdapter,只要實現(xiàn)它后就可以自定義日期適配器
package jaxb; import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DateAdapter extends XmlAdapter<String, Date> { //反序列化成日期對象Date @Override public Date unmarshal(String str) throws Exception { SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return str==null ? null:format.parse(str); } //序列化成xmL @Override public String marshal(Date date) throws Exception { SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return date==null ? "":format.format(date); } private SimpleDateFormat getSimpleDateFormat(String pattern){ SimpleDateFormat format = new SimpleDateFormat(pattern); return format; } }
2.4 Entry.java類
用來封裝map元素
package jaxb; public class Entry { private String key; private Object value; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Object getValue() { return value; } public void setValue(Object value) { this.value = value; } }
2.5、MapAdpter.java
map 轉(zhuǎn)換器
本人在寫map轉(zhuǎn)換器之后,感覺跟jaxb 默認序列化的方式?jīng)]什么區(qū)別,目前還不知道在javb中需不需要特地寫map轉(zhuǎn)換器,希望有經(jīng)驗的朋友分享下
package jaxb; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.bind.annotation.adapters.XmlAdapter; public class MapAdapter extends XmlAdapter<MapAdapter.AdapterMap,Map<String,Object>> { public static class AdapterMap { public List<Entry> entry =new ArrayList<Entry>(); } /** * 功能:xml->Map<String,Object> * @param adapterMap * @return * @throws Exception */ @Override public Map<String, Object> unmarshal(AdapterMap adapterMap) throws Exception { Map<String, Object> map = new HashMap<String, Object>(); List entry = adapterMap.entry; for(Entry en:adapterMap.entry){ map.put(en.getKey(), en.getValue()); } return map; } /** * 功能:map<String,Object> -> xml */ @Override public AdapterMap marshal(Map<String, Object> map) throws Exception { AdapterMap adapterMap = new AdapterMap(); for (Map.Entry<String, Object> entry : map.entrySet()) { Entry entry2 = new Entry(); entry2.setKey(entry.getKey()); entry2.setValue(entry.getValue()); adapterMap.entry.add(entry2); } return adapterMap; } }
2.6 測試類 JaxbDemo.java
package jaxb; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; public class JaxbDemo { public static void main(String[] args) { Student stu = new Student(); stu.setId("1"); stu.setName("羅志茂"); stu.setAge(25); stu.setBirthDay(new Date()); //list集合,set集合一樣 ArrayList<Teacher> list = new ArrayList<Teacher>(); list.add(new Teacher(2,"曾利梅",22)); list.add(new Teacher(3,"黃伙林",22)); list.add(new Teacher(4,"潘志華",22)); stu.setList(list); //在javaBean中添加javaBean Teacher teacher = new Teacher(1,"宋瑤",22); stu.setTeacher(teacher); //添加map集合 HashMap<Object, Object> map = new HashMap<>(); map.put("1", "林樂賢"); map.put("2", "德甲"); stu.setMap(map); try { JAXBContext context = JAXBContext.newInstance(Student.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK"); //marshaller.marshal(stu, System.out); StringWriter writer = new StringWriter(); marshaller.marshal(stu, writer); System.out.println(writer.toString()); //反序列化 Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader reader = new StringReader(writer.toString()); Student stu2 = (Student) unmarshaller.unmarshal(reader); System.out.println("stu2"+stu2); } catch (JAXBException e) { e.getMessage(); e.printStackTrace(); } } }
3.測試結(jié)果
<?xml version="1.0" encoding="GBK" standalone="yes"?> <student> <id>1</id> <name>羅志茂</name> <age>25</age> <birthDay>2016-08-18 23:07:26</birthDay> <list> <id>2</id> <name>曾利梅</name> <age>22</age> </list> <list> <id>3</id> <name>黃伙林</name> <age>22</age> </list> <list> <id>4</id> <name>潘志華</name> <age>22</age> </list> <teacher> <id>1</id> <name>宋瑤</name> <age>22</age> </teacher> <map> <entry> <key>2</key> <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">德甲</value> </entry> <entry> <key>1</key> <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">林樂賢</value> </entry> </map> </student>
stu2Student [id=1, name=羅志茂, age=25, birthDay=Thu Aug 18 23:07:26 CST 2016, list=[Teacher [id=2, name=曾利梅, age=22], Teacher [id=3, name=黃伙林, age=22], Teacher [id=4, name=潘志華, age=22]], teacher=Teacher [id=1, name=宋瑤, age=22], map={2=德甲, 1=林樂賢}]
更多關(guān)于java利用JAXB實現(xiàn)對象和xml互相轉(zhuǎn)換方法與實例請查看下面的相關(guān)鏈接
- java中xml和對象之間的互相轉(zhuǎn)換方法
- 通過實例學(xué)習(xí)JAVA對象轉(zhuǎn)成XML輸出
- 將Java對象序列化成JSON和XML格式的實例
- Java對象的XML序列化與反序列化實例解析
- xml與Java對象的轉(zhuǎn)換詳解
- XML到Java代碼的數(shù)據(jù)綁定之對象
- Javabean基于xstream包實現(xiàn)轉(zhuǎn)XML文檔的方法
- 使用asx3m與xstream配合解決flex與java利用httpservice傳遞xml數(shù)據(jù)問題
- java使用xstream實現(xiàn)xml文件和對象之間的相互轉(zhuǎn)換
相關(guān)文章
不寫mybatis的@Param有的報錯有的卻不報錯問題分析
這篇文章主要為大家介紹了不寫mybatis的@Param有的報錯有的卻不報錯問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09SpringBoot使用Hibernate攔截器實現(xiàn)時間自動注入的操作代碼
這篇文章主要介紹了SpringBoot使用Hibernate攔截器實現(xiàn)時間自動注入的操作代碼,主要包括hibernate攔截器的相關(guān)知識,結(jié)合實例代碼給大家講解的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實現(xiàn)
在寫項目的過程中我發(fā)現(xiàn)有的地方編碼格式被設(shè)置成了 gbk 如果用eclipse等工具直接改回utf-8編碼格式則會出現(xiàn)亂碼,所以本文給大家介紹了Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實現(xiàn),感興趣的朋友可以參考下2024-05-05