基于Jaxb实现Java Bean与Xml转换
- Jdk自带,不需要依赖第三方jar,工具类代码如下:
package utils;
import entity.Book;
import entity.Role;
import entity.Student;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date;
/**
* xml转换工具类
* java bean与xml相互转换
* jdk自带,不需要依赖第三方jar
*/
public class JaxbUtil {
private static final String DEFAULT_ENCODING = "UTF-8";
public static String toXml(Object object) {
return toXml(object, DEFAULT_ENCODING);
}
public static String toXml(Object object, String encoding) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(object, writer);
return writer.toString();
} catch (JAXBException e) {
e.printStackTrace();
}
return "";
}
@SuppressWarnings("unchecked")
public static <T> T toObject(String xml, Class<T> clazz) {
T object = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
object = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (JAXBException e) {
e.printStackTrace();
}
return object;
}
//测试
public static void main(String[] args) {
//1.基础对象序列化测试
Book book = new Book();
book.setAuthor("张三");
book.setDate(new Date());
// book.setId(1);
book.setPrice(79.1);
book.setProp("你好");
String s = toXml(book);
System.out.println(s);
//2.复杂对象序列化测试
Role role = new Role();
role.setDesc("role1");
role.setName("角色1");
role.setId("456");
Student student = new Student();
student.setId(123);
student.setName("student");
student.setRole(role);
String s1 = toXml(student);
System.out.println(s1);
//3.反序列化测试
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
"<student id=\"123\">\n" +
" <name>student</name>\n" +
" <role id=\"456\">\n" +
" <NAME>角色1</NAME>\n" +
" <DESC>role1</DESC>\n" +
" </role>\n" +
"</student>";
Student student1 = toObject(xml, Student.class);
System.out.println(student1);
//4.todo 集合对象测试
}
}
package entity;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Date;
//测试类Book
//@XmlRootElement为必须的
@XmlRootElement
public class Book {
@XmlAttribute(name = "activiti:id", required = true)
private Integer id;
@XmlElement
private String author;
//required = true时,取对应类型的默认值
//double为0.0,Double为null
//当对象类型的值为null时,不生成对应的标签
//为""时,生成空标签
//不能同时有get方法
//既没有@XmlElement,也没有get方法时,不会生成对应标签
@XmlElement(required = true)
private Date date;
@XmlElement
private Double price;
@XmlAttribute
private String prop;
// private
// public int getId() {
// return id;
// }
public void setId(Integer id) {
this.id = id;
}
// public String getAuthor() {
// return author;
// }
public void setAuthor(String author) {
this.author = author;
}
// public Date getDate() {
// return date;
// }
public void setDate(Date date) {
this.date = date;
}
// public double getPrice() {
// return price;
// }
public void setPrice(Double price) {
this.price = price;
}
public void setProp(String prop) {
this.prop = prop;
}
}
package entity;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
//测试类Student
@XmlRootElement
public class Student {
@XmlAttribute
private int id;
@XmlElement
private String name;
@XmlElement
private Role role;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setRole(Role role) {
this.role = role;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", role=" + role +
'}';
}
}
package entity;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
//测试类Role
@XmlRootElement
public class Role {
@XmlElement(name = "NAME")
private String name;
@XmlElement(name = "DESC")
private String desc;
@XmlAttribute
private String id;
public void setName(String name) {
this.name = name;
}
public void setDesc(String desc) {
this.desc = desc;
}
public void setId(String id) {
this.id = id;
}
@Override
public String toString() {
return "Role{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
", id='" + id + '\'' +
'}';
}
}