JAXB工具实现java实体类和xml之间的转换

末蓝、 2022-07-11 07:39 748阅读 0赞

1、应用场景

1、在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换

2、可以使用jersey框架实现WebService接口(resetful方式)

2、Demo

2.1 student.java 实体类,包含list(set同理)、map、Teacher、Date 类型的属性

复制代码

  1. package jaxb;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.xml.bind.annotation.XmlAccessType;
  6. import javax.xml.bind.annotation.XmlAccessorType;
  7. import javax.xml.bind.annotation.XmlElement;
  8. import javax.xml.bind.annotation.XmlElementWrapper;
  9. import javax.xml.bind.annotation.XmlRootElement;
  10. import javax.xml.bind.annotation.XmlType;
  11. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  12. @XmlType(propOrder={"id","name","age","birthDay","list","teacher","map"}) //指定序列成的xml节点顺序
  13. @XmlAccessorType(value=XmlAccessType.FIELD) //访问类型改为字段
  14. @XmlRootElement
  15. public class Student {
  16. @XmlElement
  17. private String id;
  18. @XmlElement
  19. private String name;
  20. @XmlElement
  21. private int age;
  22. @XmlJavaTypeAdapter(value=DateAdapter.class)
  23. @XmlElement
  24. private Date birthDay;
  25. @XmlElement
  26. private List<Teacher> list;
  27. @XmlElement
  28. private Teacher teacher;
  29. @XmlJavaTypeAdapter(value=MapAdapter.class)
  30. // @XmlElementWrapper(name="role")
  31. @XmlElement
  32. private Map map;
  33. public String getId() {
  34. return id;
  35. }
  36. public void setId(String id) {
  37. this.id = id;
  38. }
  39. public String getName() {
  40. return name;
  41. }
  42. public void setName(String name) {
  43. this.name = name;
  44. }
  45. public int getAge() {
  46. return age;
  47. }
  48. public void setAge(int age) {
  49. this.age = age;
  50. }
  51. public Date getBirthDay() {
  52. return birthDay;
  53. }
  54. public void setBirthDay(Date birthDay) {
  55. this.birthDay = birthDay;
  56. }
  57. public List getList() {
  58. return list;
  59. }
  60. public void setList(List list) {
  61. this.list = list;
  62. }
  63. public Teacher getTeacher() {
  64. return teacher;
  65. }
  66. public void setTeacher(Teacher teacher) {
  67. this.teacher = teacher;
  68. }
  69. public Map getMap() {
  70. return map;
  71. }
  72. public void setMap(Map map) {
  73. this.map = map;
  74. }
  75. @Override
  76. public String toString() {
  77. return "Student [id=" + id + ", name=" + name + ", age=" + age
  78. + ", birthDay=" + birthDay + ", list=" + list + ", teacher="
  79. + teacher + ", map=" + map + "]";
  80. }
  81. }

复制代码

2.2 Teacher.java类 注意:Teacher 类不包含@XmlRootElement节点,因为目的是转成一个XML文档,根节点只有一个

复制代码

  1. package jaxb;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlElement;
  5. import javax.xml.bind.annotation.XmlType;
  6. @XmlAccessorType(value=XmlAccessType.FIELD)
  7. @XmlType(propOrder={"id","name","age"})
  8. public class Teacher {
  9. @XmlElement
  10. private int id;
  11. @XmlElement
  12. private String name;
  13. @XmlElement
  14. private int age;
  15. public int getId() {
  16. return id;
  17. }
  18. public void setId(int id) {
  19. this.id = id;
  20. }
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getAge() {
  28. return age;
  29. }
  30. public void setAge(int age) {
  31. this.age = age;
  32. }
  33. public Teacher(int id, String name, int age) {
  34. super();
  35. this.id = id;
  36. this.name = name;
  37. this.age = age;
  38. }
  39. public Teacher() {
  40. }
  41. @Override
  42. public String toString() {
  43. return "Teacher [id=" + id + ", name=" + name + ", age=" + age + "]";
  44. }
  45. }

复制代码

2.3 DateApdapter.java 自定义时间适配器类

在java实体类序列化xml日期时,需要对时间进行自定义转换,jaxb提供了XmlAdapter,只要实现它后就可以自定义日期适配器

复制代码

  1. package jaxb;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import javax.xml.bind.annotation.adapters.XmlAdapter;
  5. public class DateAdapter extends XmlAdapter<String, Date> {
  6. //反序列化成日期对象Date
  7. @Override
  8. public Date unmarshal(String str) throws Exception {
  9. SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10. return str==null ? null:format.parse(str);
  11. }
  12. //序列化成xmL
  13. @Override
  14. public String marshal(Date date) throws Exception {
  15. SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. return date==null ? "":format.format(date);
  17. }
  18. private SimpleDateFormat getSimpleDateFormat(String pattern){
  19. SimpleDateFormat format = new SimpleDateFormat(pattern);
  20. return format;
  21. }
  22. }

复制代码

2.4 Entry.java 类 用来封装map元素

复制代码

  1. package jaxb;
  2. public class Entry {
  3. private String key;
  4. private Object value;
  5. public String getKey() {
  6. return key;
  7. }
  8. public void setKey(String key) {
  9. this.key = key;
  10. }
  11. public Object getValue() {
  12. return value;
  13. }
  14. public void setValue(Object value) {
  15. this.value = value;
  16. }
  17. }

复制代码

2.5、MapAdpter.java map 转换器

本人在写map转换器之后,感觉跟jaxb 默认序列化的方式没什么区别,目前还不知道在javb中需不需要特地写map转换器,希望有经验的朋友分享下

复制代码

  1. package jaxb;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.xml.bind.annotation.adapters.XmlAdapter;
  7. public class MapAdapter extends XmlAdapter<MapAdapter.AdapterMap,Map<String,Object>> {
  8. public static class AdapterMap {
  9. public List<Entry> entry =new ArrayList<Entry>();
  10. }
  11. /**
  12. * 功能:xml->Map<String,Object>
  13. * @param adapterMap
  14. * @return
  15. * @throws Exception
  16. */
  17. @Override
  18. public Map<String, Object> unmarshal(AdapterMap adapterMap) throws Exception {
  19. Map<String, Object> map = new HashMap<String, Object>();
  20. List entry = adapterMap.entry;
  21. for(Entry en:adapterMap.entry){
  22. map.put(en.getKey(), en.getValue());
  23. }
  24. return map;
  25. }
  26. /**
  27. * 功能:map<String,Object> -> xml
  28. */
  29. @Override
  30. public AdapterMap marshal(Map<String, Object> map) throws Exception {
  31. AdapterMap adapterMap = new AdapterMap();
  32. for (Map.Entry<String, Object> entry : map.entrySet()) {
  33. Entry entry2 = new Entry();
  34. entry2.setKey(entry.getKey());
  35. entry2.setValue(entry.getValue());
  36. adapterMap.entry.add(entry2);
  37. }
  38. return adapterMap;
  39. }
  40. }

复制代码

2.6 测试类 JaxbDemo.java

复制代码

  1. package jaxb;
  2. import java.io.StringReader;
  3. import java.io.StringWriter;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import javax.xml.bind.JAXBContext;
  8. import javax.xml.bind.JAXBException;
  9. import javax.xml.bind.Marshaller;
  10. import javax.xml.bind.Unmarshaller;
  11. public class JaxbDemo {
  12. public static void main(String[] args) {
  13. Student stu = new Student();
  14. stu.setId("1");
  15. stu.setName("罗志茂");
  16. stu.setAge(25);
  17. stu.setBirthDay(new Date());
  18. //list集合,set集合一样
  19. ArrayList<Teacher> list = new ArrayList<Teacher>();
  20. list.add(new Teacher(2,"曾利梅",22));
  21. list.add(new Teacher(3,"黄伙林",22));
  22. list.add(new Teacher(4,"潘志华",22));
  23. stu.setList(list);
  24. //在javaBean中添加javaBean
  25. Teacher teacher = new Teacher(1,"宋瑶",22);
  26. stu.setTeacher(teacher);
  27. //添加map集合
  28. HashMap<Object, Object> map = new HashMap<>();
  29. map.put("1", "林乐贤");
  30. map.put("2", "德甲");
  31. stu.setMap(map);
  32. try {
  33. JAXBContext context = JAXBContext.newInstance(Student.class);
  34. Marshaller marshaller = context.createMarshaller();
  35. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  36. marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
  37. //marshaller.marshal(stu, System.out);
  38. StringWriter writer = new StringWriter();
  39. marshaller.marshal(stu, writer);
  40. System.out.println(writer.toString());
  41. //反序列化
  42. Unmarshaller unmarshaller = context.createUnmarshaller();
  43. StringReader reader = new StringReader(writer.toString());
  44. Student stu2 = (Student) unmarshaller.unmarshal(reader);
  45. System.out.println("stu2"+stu2);
  46. } catch (JAXBException e) {
  47. e.getMessage();
  48. e.printStackTrace();
  49. }
  50. }
  51. }

复制代码

3.测试结果

复制代码

  1. <?xml version="1.0" encoding="GBK" standalone="yes"?>
  2. <student>
  3. <id>1</id>
  4. <name>罗志茂</name>
  5. <age>25</age>
  6. <birthDay>2016-08-18 23:07:26</birthDay>
  7. <list>
  8. <id>2</id>
  9. <name>曾利梅</name>
  10. <age>22</age>
  11. </list>
  12. <list>
  13. <id>3</id>
  14. <name>黄伙林</name>
  15. <age>22</age>
  16. </list>
  17. <list>
  18. <id>4</id>
  19. <name>潘志华</name>
  20. <age>22</age>
  21. </list>
  22. <teacher>
  23. <id>1</id>
  24. <name>宋瑶</name>
  25. <age>22</age>
  26. </teacher>
  27. <map>
  28. <entry>
  29. <key>2</key>
  30. <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">德甲</value>
  31. </entry>
  32. <entry>
  33. <key>1</key>
  34. <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">林乐贤</value>
  35. </entry>
  36. </map>
  37. </student>
  38. stu2Student [id=1, name=罗志茂, age=25, birthDay=Thu Aug 18 23:07:26 CST 2016, list=[Teacher [id=2, name=曾利梅, age=22], Teacher [id=3, name=黄伙林, age=22], Teacher [id=4, name=潘志华, age=22]], teacher=Teacher [id=1, name=宋瑶, age=22], map={2=德甲, 1=林乐贤}]

发表评论

表情:
评论列表 (有 0 条评论,748人围观)

还没有评论,来说两句吧...

相关阅读