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,Class c){ 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 */ publicList getProvinceList(){ returnprovinceList; } /** *@paramnamethenametoset */ publicvoidsetName(Stringname){ this.name=name; } /** *@paramprovinceListtheprovinceListtoset */ publicvoidsetProvinceList(List provinceList){ 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程序设计有所帮助。