Jaxb2实现JavaBean与xml互转的方法详解
本文实例讲述了Jaxb2实现JavaBean与xml互转的方法。分享给大家供大家参考,具体如下:
一、简介
JAXB(JavaArchitectureforXMLBinding)是一个业界的标准,是一项可以根据XMLSchema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。
Jaxb2.0是JDK1.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、准备工作
packageutils;
importjava.io.StringReader;
importjava.io.StringWriter;
importjavax.xml.bind.JAXBContext;
importjavax.xml.bind.Marshaller;
importjavax.xml.bind.Unmarshaller;
/**
*Jaxb2工具类
*@authorzhuc
*@create2013-3-29下午2:40:14
*/
publicclassJaxbUtil{
/**
*JavaBean转换成xml
*默认编码UTF-8
*@paramobj
*@paramwriter
*@return
*/
publicstaticStringconvertToXml(Objectobj){
returnconvertToXml(obj,"UTF-8");
}
/**
*JavaBean转换成xml
*@paramobj
*@paramencoding
*@return
*/
publicstaticStringconvertToXml(Objectobj,Stringencoding){
Stringresult=null;
try{
JAXBContextcontext=JAXBContext.newInstance(obj.getClass());
Marshallermarshaller=context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding);
StringWriterwriter=newStringWriter();
marshaller.marshal(obj,writer);
result=writer.toString();
}catch(Exceptione){
e.printStackTrace();
}
returnresult;
}
/**
*xml转换成JavaBean
*@paramxml
*@paramc
*@return
*/
@SuppressWarnings("unchecked")
publicstaticTconveryToJavaBean(Stringxml,Classc){
Tt=null;
try{
JAXBContextcontext=JAXBContext.newInstance(c);
Unmarshallerunmarshaller=context.createUnmarshaller();
t=(T)unmarshaller.unmarshal(newStringReader(xml));
}catch(Exceptione){
e.printStackTrace();
}
returnt;
}
}
非常简单易懂,需要注意的是
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding);
Marshaller.JAXB_FORMATTED_OUTPUT决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
Marshaller.JAXB_ENCODINGxml的编码方式
另外,Marshaller还有其他Property可以设置,可以去查阅api。
2、最简单转换
packaget1;
importjava.util.Date;
importjavax.xml.bind.annotation.XmlAccessType;
importjavax.xml.bind.annotation.XmlAccessorType;
importjavax.xml.bind.annotation.XmlAttribute;
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlRootElement;
importjavax.xml.bind.annotation.XmlType;
/**
*@authorzhuc
*@create2013-3-29下午2:49:48
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
@XmlType(name="book",propOrder={"author","calendar","price","id"})
publicclassBook{
@XmlElement(required=true)
privateStringauthor;
@XmlElement(name="price_1",required=true)
privatefloatprice;
@XmlElement
privateDatecalendar;
@XmlAttribute
privateIntegerid;
/**
*@returntheauthor
*/
publicStringgetAuthor(){
returnauthor;
}
/**
*@returntheprice
*/
publicfloatgetPrice(){
returnprice;
}
/**
*@returnthecalendar
*/
publicDategetCalendar(){
returncalendar;
}
/**
*@returntheid
*/
publicIntegergetId(){
returnid;
}
/**
*@paramauthortheauthortoset
*/
publicvoidsetAuthor(Stringauthor){
this.author=author;
}
/**
*@parampricethepricetoset
*/
publicvoidsetPrice(floatprice){
this.price=price;
}
/**
*@paramcalendarthecalendartoset
*/
publicvoidsetCalendar(Datecalendar){
this.calendar=calendar;
}
/**
*@paramidtheidtoset
*/
publicvoidsetId(Integerid){
this.id=id;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Book[author="+author+",price="+price+",calendar="+calendar+",id="+id+"]";
}
}
packaget1;
importjava.util.Date;
importjavax.xml.bind.JAXBException;
importorg.junit.Test;
importutils.JaxbUtil;
/**
*@authorzhuc
*@create2013-3-29下午2:50:00
*/
publicclassJaxbTest1{
/**
*@throwsJAXBException
*/
@Test
publicvoidshowMarshaller(){
Bookbook=newBook();
book.setId(100);
book.setAuthor("James");
book.setCalendar(newDate());
book.setPrice(23.45f);//默认是0.0
Stringstr=JaxbUtil.convertToXml(book);
System.out.println(str);
}
/**
*@throwsJAXBException
*/
@Test
publicvoidshowUnMarshaller(){
Stringstr=""+
""+
"James "+
"2013-03-29T09:25:56.004+08:00 "+
"23.45 "+
"";
Bookbook=JaxbUtil.converyToJavaBean(str,Book.class);
System.out.println(book);
}
}
输出结果分别为:
James 2013-03-29T14:50:58.974+08:00 23.45 Book[author=James,price=23.45,calendar=FriMar2909:25:56CST2013,id=100]
3、类中包含复杂对象的转换
packaget2;
importjavax.xml.bind.annotation.XmlAccessType;
importjavax.xml.bind.annotation.XmlAccessorType;
importjavax.xml.bind.annotation.XmlAttribute;
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlRootElement;
importjavax.xml.bind.annotation.XmlType;
/**
*@authorzhuc
*@create2013-3-29下午2:51:44
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="student")
@XmlType(propOrder={})
publicclassStudent{
@XmlAttribute
privateIntegerid;
@XmlElement
privateStringname;
@XmlElement(name="role")
privateRolerole;
/**
*@returntheid
*/
publicIntegergetId(){
returnid;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@returntherole
*/
publicRolegetRole(){
returnrole;
}
/**
*@paramidtheidtoset
*/
publicvoidsetId(Integerid){
this.id=id;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@paramroletheroletoset
*/
publicvoidsetRole(Rolerole){
this.role=role;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Student[id="+id+",name="+name+",role="+role+"]";
}
}
packaget2;
importjavax.xml.bind.annotation.XmlAccessType;
importjavax.xml.bind.annotation.XmlAccessorType;
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlType;
/**
*@authorzhuc
*@create2013-3-29下午2:51:52
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name","desc"})
publicclassRole{
@XmlElement
privateStringname;
@XmlElement
privateStringdesc;
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@returnthedesc
*/
publicStringgetDesc(){
returndesc;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@paramdescthedesctoset
*/
publicvoidsetDesc(Stringdesc){
this.desc=desc;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Role[name="+name+",desc="+desc+"]";
}
}
packaget2;
importorg.junit.Test;
importutils.JaxbUtil;
/**
*@authorzhuc
*@create2013-3-29下午2:52:00
*/
publicclassJaxbTest2{
@Test
publicvoidshowMarshaller(){
Studentstudent=newStudent();
student.setId(12);
student.setName("test");
Rolerole=newRole();
role.setDesc("管理");
role.setName("班长");
student.setRole(role);
Stringstr=JaxbUtil.convertToXml(student);
System.out.println(str);
}
@Test
publicvoidshowUnMarshaller(){
Stringstr=""+
""+
"test "+
""+
"班长 "+
"管理 "+
" "+
"";
Studentstudent=JaxbUtil.converyToJavaBean(str,Student.class);
System.out.println(student);
}
}
输出结果分别为:
test Student[id=12,name=test,role=Role[name=班长,desc=管理]] 班长 管理
4、集合对象的转换(同样适用于Set)
packaget3;
importjava.util.List;
importjavax.xml.bind.annotation.XmlAccessType;
importjavax.xml.bind.annotation.XmlAccessorType;
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlElementWrapper;
importjavax.xml.bind.annotation.XmlRootElement;
importjavax.xml.bind.annotation.XmlType;
/**
*@authorzhuc
*@create2013-3-29下午2:55:56
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="country")
@XmlType(propOrder={"name","provinceList"})
publicclassCountry{
@XmlElement(name="country_name")
privateStringname;
@XmlElementWrapper(name="provinces")
@XmlElement(name="province")
privateListprovinceList;
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@returntheprovinceList
*/
publicListgetProvinceList(){
returnprovinceList;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@paramprovinceListtheprovinceListtoset
*/
publicvoidsetProvinceList(ListprovinceList){
this.provinceList=provinceList;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Country[name="+name+",provinceList="+provinceList+"]";
}
}
packaget3;
importjavax.xml.bind.annotation.XmlAccessType;
importjavax.xml.bind.annotation.XmlAccessorType;
importjavax.xml.bind.annotation.XmlElement;
importjavax.xml.bind.annotation.XmlType;
/**
*@authorzhuc
*@create2013-3-29下午2:56:03
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name","provCity"})
publicclassProvince{
@XmlElement(name="province_name")
privateStringname;
@XmlElement(name="prov_city")
privateStringprovCity;
/**
*@returntheprovCity
*/
publicStringgetProvCity(){
returnprovCity;
}
/**
*@paramprovCitytheprovCitytoset
*/
publicvoidsetProvCity(StringprovCity){
this.provCity=provCity;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@paramnamethenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/*(non-Javadoc)
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Province[name="+name+",provCity="+provCity+"]";
}
}
packaget3;
importjava.util.ArrayList;
importjava.util.List;
importorg.junit.Test;
importutils.JaxbUtil;
/**
*@authorzhuc
*@create2013-3-29下午2:56:11
*/
publicclassJaxbTest3{
/**
*@throwsJAXBException
*/
@Test
publicvoidshowMarshaller(){
Countrycountry=newCountry();
country.setName("中国");
Listlist=newArrayList();
Provinceprovince=newProvince();
province.setName("江苏省");
province.setProvCity("南京市");
Provinceprovince2=newProvince();
province2.setName("浙江省");
province2.setProvCity("杭州市");
list.add(province);
list.add(province2);
country.setProvinceList(list);
Stringstr=JaxbUtil.convertToXml(country);
System.out.println(str);
}
/**
*
*/
@Test
publicvoidshowUnMarshaller(){
Stringstr=""+
""+
"中国 "+
""+
""+
"江苏省 "+
"南京市 "+
" "+
""+
"浙江省 "+
"杭州市 "+
" "+
" "+
" ";
Countrycountry=JaxbUtil.converyToJavaBean(str,Country.class);
System.out.println(country);
}
}
输出结果分别为:
Country[name=中国,provinceList=[Province[name=江苏省,provCity=南京市],Province[name=浙江省,provCity=杭州市]]] 中国 江苏省 南京市 浙江省 杭州市
PS:这里再为大家推荐一款本站相关的JavaBean在线工具供大家参考使用:
在线JSON转JavaBean代码工具:
http://tools.jb51.net/code/json2javabean
希望本文所述对大家java程序设计有所帮助。