java利用JAXB實(shí)現(xiàn)對象和xml互相轉(zhuǎn)換方法與實(shí)例詳解
1、JAXB應(yīng)用場景
在使用WebService實(shí)現(xiàn)數(shù)據(jù)上傳下載,數(shù)據(jù)查詢時(shí),可以利用JAXB實(shí)現(xiàn)java實(shí)體類和xml互相轉(zhuǎn)換
2、Demo
2.1 student.java 實(shí)體類
包含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é)點(diǎn)順序
@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é)點(diǎn),因?yàn)槟康氖寝D(zhuǎn)成一個(gè)XML文檔,根節(jié)點(diǎn)只有一個(gè)
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
自定義時(shí)間適配器類
在java實(shí)體類序列化xml日期時(shí),需要對時(shí)間進(jìn)行自定義轉(zhuǎn)換,jaxb提供了XmlAdapter,只要實(shí)現(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 默認(rèn)序列化的方式?jīng)]什么區(qū)別,目前還不知道在javb中需不需要特地寫map轉(zhuǎn)換器,希望有經(jīng)驗(yàn)的朋友分享下
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實(shí)現(xiàn)對象和xml互相轉(zhuǎn)換方法與實(shí)例請查看下面的相關(guān)鏈接
- java中xml和對象之間的互相轉(zhuǎn)換方法
- 通過實(shí)例學(xué)習(xí)JAVA對象轉(zhuǎn)成XML輸出
- 將Java對象序列化成JSON和XML格式的實(shí)例
- Java對象的XML序列化與反序列化實(shí)例解析
- xml與Java對象的轉(zhuǎn)換詳解
- XML到Java代碼的數(shù)據(jù)綁定之對象
- Javabean基于xstream包實(shí)現(xiàn)轉(zhuǎn)XML文檔的方法
- 使用asx3m與xstream配合解決flex與java利用httpservice傳遞xml數(shù)據(jù)問題
- java使用xstream實(shí)現(xiàn)xml文件和對象之間的相互轉(zhuǎn)換
相關(guān)文章
Java8中Stream使用的一個(gè)注意事項(xiàng)
最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中Stream使用過程中的一個(gè)注意事項(xiàng),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析
這篇文章主要為大家介紹了不寫mybatis的@Param有的報(bào)錯(cuò)有的卻不報(bào)錯(cuò)問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制
這篇文章主要介紹了Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05
SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼
這篇文章主要介紹了SpringBoot使用Hibernate攔截器實(shí)現(xiàn)時(shí)間自動(dòng)注入的操作代碼,主要包括hibernate攔截器的相關(guān)知識,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10
詳解Java的Spring框架下bean的自動(dòng)裝載方式
這篇文章主要介紹了Java的Spring框架下bean的自動(dòng)裝載方式,Spring是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
springboot默認(rèn)日志框架選擇源碼解析(推薦)
這篇文章主要介紹了springboot默認(rèn)日志框架選擇源碼解析(推薦),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實(shí)現(xiàn)
在寫項(xiàng)目的過程中我發(fā)現(xiàn)有的地方編碼格式被設(shè)置成了 gbk 如果用eclipse等工具直接改回utf-8編碼格式則會(huì)出現(xiàn)亂碼,所以本文給大家介紹了Java工程編碼格式由GBK轉(zhuǎn)化成utf-8的具體實(shí)現(xiàn),感興趣的朋友可以參考下2024-05-05

