本文实例讲述了Jaxb2实现JavaBean与xml互转的方法。分享给大家供大家参考,具体如下:
一、简介
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。
Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。Jaxb2使用了JDK的新特性,如:Annotation、GenericType等,需要在即将转换的JavaBean中添加annotation注解。
二、重要概念
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller接口,将Java对象序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
@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属性。
三、示例
1.工具类
package cn.om.utils;
import java.io.StringReader;
import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;
public class JaxbUtil {
/** * JavaBean装换成xml * 默认编码UTF-8 * @param obj * @return */ public static String converTomXml(Object obj) { return converToXml(obj,"UTF-8");}
/** * JavaBean装换成xml * @param obj * @param encoding * @return */ private static String converToXml(Object obj, String encoding) { String result = null; try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding); StringWriter writer = new StringWriter(); marshaller.marshal(obj,writer); result =writer.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * xml装换成JavaBean * @param xml * @param c * @return */ @SuppressWarnings("unchecked") public static<T> T converyToJavaBean(String xml,Class<T> c){ T t = null; try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); t = (T)unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { e.printStackTrace(); } return t; }}
需要注意的是
Marshaller.JAXB_FORMATTED_OUTPUT 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
Marshaller.JAXB_ENCODING xml的编码方式
另外,Marshaller 还有其他Property可以设置,可以去查阅api。
2.转换
package cn.com.t1;
import java.util.Date;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement@XmlType(name = "book",propOrder = {"author","calendar","price","id"})public class Book { @XmlElement(required = true) private String author; @XmlElement(name = "price_1",required = true) private float price; @XmlElement private Date calendar; @XmlAttribute private Integer id; /** * * @return */ public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public Date getCalendar() { return calendar; } public void setCalendar(Date calendar) { this.calendar = calendar; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Override public String toString() { return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]"; }}
package cn.com.t1;
import java.util.Date;
import org.junit.Test;import javax.xml.bind.JAXBException;import cn.om.utils.JaxbUtil; @SuppressWarnings("unused")public class JaxbTest1 { /** * @throws JAXBException */ @Test public void showMarshaller(){ Book book = new Book(); book.setId(100); book.setAuthor("lin"); book.setCalendar(new Date()); book.setPrice(23.56f); String str = JaxbUtil.converTomXml(book); System.out.println(str); } /** * @throws JAXBException */ @Test public void showUnMarshaller(){ String str = "<?xml version =\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+ "<book id =\"100\">"+ "<author>lin</author>" + "<calendar>2018-9-3T11:58.006</calendar>"+ "<price_1>23.56</price_1>"+ "</book>"; Book book = JaxbUtil.converyToJavaBean(str,Book.class); System.out.println(book); }}
输出结果:
3、类中包含复杂对象的转换
3.1
package cn.com.t2;
import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType; @XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name = "student")@XmlType(propOrder = {})public class Student { @XmlAttribute private Integer id; @XmlElement private String name; @XmlElement(name = "role") private Role role; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Role getRole() { return role; } public void setRole(Role role) { this.role = role; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", role=" + role + "]"; }}
3.2
package cn.com.t2;
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(XmlAccessType.FIELD)
@XmlType(propOrder = {"name","desc"})public class Role { @XmlElement private String name; @XmlElement private String desc; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } @Override public String toString() { return "Role [name="+name+",desc="+desc+"]"; }}3.3
package cn.com.t2;
import org.junit.Test;
import cn.om.utils.JaxbUtil;
public class JaxbTest2 {
@Test public void showMarshaller(){ Student student = new Student(); student.setId(12); student.setName("nihao"); Role role = new Role(); role.setDesc("管理"); role.setName("班长"); student.setRole(role); String str = JaxbUtil.converTomXml(student); System.out.println(str); } @Test public void showUnMarshaller(){ String str = "<?xml version =\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+ "<student id =\"12\">"+ "<name>nihao</name>" + "<role>"+ "<desc>管理</desc>"+ "<name>班长</name>"+ "</role>"+ "</student>"; Student student = JaxbUtil.converyToJavaBean(str, Student.class); System.out.println(student); }}
输出结果
4、集合对象的转换(同样适用于Set)
4.1
package cn.com.t3;
import java.util.List;
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;@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "country")@XmlType(propOrder = {"name","provinceList"})public class Country { @XmlElement(name = "country_name") private String name; @XmlElementWrapper(name = "provinces") @XmlElement(name = "province") private List<Province> provinceList;public String getName() {
return name; }public void setName(String name) {
this.name = name; }public List<Province> getProvinceList() {
return provinceList; }public void setProvinceList(List<Province> provinceList) {
this.provinceList = provinceList; } @Override public String toString(){ return "Country [name = "+ name +",provinceList" + provinceList + "]"; }}
4.2
package cn.com.t3;
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(XmlAccessType.FIELD)
@XmlType(propOrder = {"name","provCity"})public class Province { @XmlElement(name = "province_name") private String name; @XmlElement(name = "prov_city") private String provCity; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getProvCity() { return provCity; } public void setProvCity(String provCity) { this.provCity = provCity; } @Override public String toString(){ return "Province [name=" + name +", provCity=" + provCity + "]"; }}
4.3
package cn.com.t3;
import java.util.List;
import java.util.ArrayList;import org.junit.Test;
import cn.om.utils.JaxbUtil;
public class JaxbTest3 {
@Test
public void showShaller(){ Country country = new Country(); country.setName("中国"); List<Province> list = new ArrayList<Province>(); Province province = new Province(); province.setName("辽宁省"); province.setProvCity("大连市"); Province province2 = new Province(); province2.setName("黑龙江省"); province2.setProvCity("哈尔滨市"); list.add(province); list.add(province2); country.setProvinceList(list); String str = JaxbUtil.converTomXml(country); System.out.println(str); } @Test public void showUnShaller(){ String str = "<?xml version =\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"+ "<country>"+ "<country_name>中国</country_name>"+ "<provinces>"+ "<province>"+ "<province_name>辽宁省</province_name>"+ "<prov_city>大连市</prov_city>"+ "</province>"+ "<province>"+ "<province_name>黑龙江省</province_name>"+ "<prov_city>哈尔滨市</prov_city>"+ "</province>"+ "</provinces>"+ "</country>"; Country country = JaxbUtil.converyToJavaBean(str, Country.class); System.out.println(country); }}输出结果:
其中运行后错误:
红框处province少写一个n,获取不到省份信息
红框处prov_city没有和前面的匹配上,所以获取不到任何的值
尽量手敲这个代码,不要复制!!!
参考文章:
https://blog.csdn.net/u010502101/article/details/79586834