java xml bean_JavaBean与xml互转的方法详解

本文实例讲述了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 converyToJavaBean(String xml,Class 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;

}

}

需要注意的是

107164be1cb9700568f153c6c695b8a0.png

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\"?>"+

""+

"lin" +

"2018-9-3T11:58.006"+

"23.56"+

"";

Book book = JaxbUtil.converyToJavaBean(str,Book.class);

System.out.println(book);

}

}

输出结果:

db242112873b63f6f38a59e91f0fcf4f.png

d46e8f1eef2e5c191d31b5f7e7699039.png

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\"?>"+

""+

"nihao" +

""+

"管理"+

"班长"+

""+

"";

Student student = JaxbUtil.converyToJavaBean(str, Student.class);

System.out.println(student);

}

}

输出结果

34aeac4c06683795afc95827175d8c4f.png

7a518ae88032e0200c80b70a100c7bd8.png

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 provinceList;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public List getProvinceList() {

return provinceList;

}

public void setProvinceList(List 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 list = new ArrayList();

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 = JaxbUtil.converyToJavaBean(str, Country.class);

System.out.println(country);

}

}

输出结果:

a674fa13723a0d7471481419df15b746.png

d1a1fc09a9da61cf0674923408bb6e79.png

其中运行后错误:

c6c691ae772bf71c75236559b8495b92.png

红框处province少写一个n,获取不到省份信息

9fa68c62cc34b1098abaf0ec9abccd29.png

红框处prov_city没有和前面的匹配上,所以获取不到任何的值

尽量手敲这个代码,不要复制!!!

参考文章:

https://blog.csdn.net/u010502101/article/details/79586834

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值