zoukankan      html  css  js  c++  java
  • Jaxb2实现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 utils;
    import java.io.StringReader;
    import java.io.StringWriter;
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    /**
     * Jaxb2工具类
     * @author   zhuc
     * @create   2013-3-29 下午2:40:14
     */
    public class JaxbUtil {
      /**
       * JavaBean转换成xml
       * 默认编码UTF-8
       * @param obj
       * @param writer
       * @return
       */
      public static String convertToXml(Object obj) {
        return convertToXml(obj, "UTF-8");
      }
      /**
       * JavaBean转换成xml
       * @param obj
       * @param encoding
       * @return
       */
      public static String convertToXml(Object obj, String encoding) {
        String result = null;
        try {
          JAXBContext context = JAXBContext.newInstance(obj.getClass());
          Marshaller marshaller = context.createMarshaller();
        // 决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml) marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
       // xml的编码方式 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> T converyToJavaBean(String xml, Class<T> 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; } }

    2、最简单转换

    package 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;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:49:48
     */
    @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 the author
       */
      public String getAuthor() {
        return author;
      }
      /**
       * @return the price
       */
      public float getPrice() {
        return price;
      }
      /**
       * @return the calendar
       */
      public Date getCalendar() {
        return calendar;
      }
      /**
       * @return the id
       */
      public Integer getId() {
        return id;
      }
      /**
       * @param author the author to set
       */
      public void setAuthor(String author) {
        this.author = author;
      }
      /**
       * @param price the price to set
       */
      public void setPrice(float price) {
        this.price = price;
      }
      /**
       * @param calendar the calendar to set
       */
      public void setCalendar(Date calendar) {
        this.calendar = calendar;
      }
      /**
       * @param id the id to set
       */
      public void setId(Integer id) {
        this.id = id;
      }
      /* (non-Javadoc)
       * @see java.lang.Object#toString()
       */
      @Override
      public String toString() {
        return "Book [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";
      }
    }
    
    package t1;
    import java.util.Date;
    import javax.xml.bind.JAXBException;
    import org.junit.Test;
    import utils.JaxbUtil;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:50:00
     */
    public class JaxbTest1 {
      /**
       * @throws JAXBException
       */
      @Test
      public void showMarshaller() {
        Book book = new Book();
        book.setId(100);
        book.setAuthor("James");
        book.setCalendar(new Date());
        book.setPrice(23.45f);  //默认是0.0
        String str = JaxbUtil.convertToXml(book);
        System.out.println(str);
      }
      /**
       * @throws JAXBException
       */
      @Test
      public void showUnMarshaller() {
        String str = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>" +
          "<book id="100">" +
          "  <author>James</author>" +
           "  <calendar>2013-03-29T09:25:56.004+08:00</calendar>" +
           " <price_1>23.45</price_1>" +
          "</book>";
        Book book = JaxbUtil.converyToJavaBean(str, Book.class);
        System.out.println(book);
      }
    }
    

    输出结果分别为:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <book id="100">
      <author>James</author>
      <calendar>2013-03-29T14:50:58.974+08:00</calendar>
      <price_1>23.45</price_1>
    </book>
    
    Book [author=James, price=23.45, calendar=Fri Mar 29 09:25:56 CST 2013, id=100]
    

    3、类中包含复杂对象的转换

    package 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;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:51:44
     */
    @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;
      /**
       * @return the id
       */
      public Integer getId() {
        return id;
      }
      /**
       * @return the name
       */
      public String getName() {
        return name;
      }
      /**
       * @return the role
       */
      public Role getRole() {
        return role;
      }
      /**
       * @param id the id to set
       */
      public void setId(Integer id) {
        this.id = id;
      }
      /**
       * @param name the name to set
       */
      public void setName(String name) {
        this.name = name;
      }
      /**
       * @param role the role to set
       */
      public void setRole(Role role) {
        this.role = role;
      }
      /* (non-Javadoc)
       * @see java.lang.Object#toString()
       */
      @Override
      public String toString() {
        return "Student [id=" + id + ", name=" + name + ", role=" + role + "]";
      }
    }
    
    package 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;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:51:52
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = { "name", "desc" })
    public class Role {
      @XmlElement
      private String name;
      @XmlElement
      private String desc;
      /**
       * @return the name
       */
      public String getName() {
        return name;
      }
      /**
       * @return the desc
       */
      public String getDesc() {
        return desc;
      }
      /**
       * @param name the name to set
       */
      public void setName(String name) {
        this.name = name;
      }
      /**
       * @param desc the desc to set
       */
      public void setDesc(String desc) {
        this.desc = desc;
      }
      /* (non-Javadoc)
       * @see java.lang.Object#toString()
       */
      @Override
      public String toString() {
        return "Role [name=" + name + ", desc=" + desc + "]";
      }
    }
    
    package t2;
    import org.junit.Test;
    import utils.JaxbUtil;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:52:00
     */
    public class JaxbTest2 {
      @Test
      public void showMarshaller() {
        Student student = new Student();
        student.setId(12);
        student.setName("test");
        Role role = new Role();
        role.setDesc("管理");
        role.setName("班长");
        student.setRole(role);
        String str = JaxbUtil.convertToXml(student);
        System.out.println(str);
      }
      @Test
      public void showUnMarshaller() {
        String str = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"+
          "<student id="12">"+
          "  <name>test</name>"+
           "  <role>"+
           "   <name>班长</name>"+
            "   <desc>管理</desc>"+
            "</role>"+
          "</student>";
        Student student = JaxbUtil.converyToJavaBean(str, Student.class);
        System.out.println(student);
      }
    }
    

    输出结果分别为:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <student id="12">
      <name>test</name>
      <role>
        <name>班长</name>
        <desc>管理</desc>
      </role>
    </student>
    
    Student [id=12, name=test, role=Role [name=班长, desc=管理]]
    

    4、集合对象的转换(同样适用于Set)

    package 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;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:55:56
     */
    @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<Province> provinceList;
      /**
       * @return the name
       */
      public String getName() {
        return name;
      }
      /**
       * @return the provinceList
       */
      public List<Province> getProvinceList() {
        return provinceList;
      }
      /**
       * @param name the name to set
       */
      public void setName(String name) {
        this.name = name;
      }
      /**
       * @param provinceList the provinceList to set
       */
      public void setProvinceList(List<Province> provinceList) {
        this.provinceList = provinceList;
      }
      /* (non-Javadoc)
       * @see java.lang.Object#toString()
       */
      @Override
      public String toString() {
        return "Country [name=" + name + ", provinceList=" + provinceList + "]";
      }
    }
    
    package 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;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:56:03
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(propOrder = { "name", "provCity" })
    public class Province {
      @XmlElement(name = "province_name")
      private String name;
      @XmlElement(name = "prov_city")
      private String provCity;
      /**
       * @return the provCity
       */
      public String getProvCity() {
        return provCity;
      }
      /**
       * @param provCity the provCity to set
       */
      public void setProvCity(String provCity) {
        this.provCity = provCity;
      }
      /**
       * @return the name
       */
      public String getName() {
        return name;
      }
      /**
       * @param name the name to set
       */
      public void setName(String name) {
        this.name = name;
      }
      /* (non-Javadoc)
       * @see java.lang.Object#toString()
       */
      @Override
      public String toString() {
        return "Province [name=" + name + ", provCity=" + provCity + "]";
      }
    }
    
    package t3;
    import java.util.ArrayList;
    import java.util.List;
    import org.junit.Test;
    import utils.JaxbUtil;
    /**
     * @author   zhuc
     * @create   2013-3-29 下午2:56:11
     */
    public class JaxbTest3 {
      /**
       * @throws JAXBException
       */
      @Test
      public void showMarshaller() {
        Country country = new Country();
        country.setName("中国");
        List<Province> list = new ArrayList<Province>();
        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.convertToXml(country);
        System.out.println(str);
      }
      /**
       *
       */
      @Test
      public void showUnMarshaller() {
        String str = "<?xml version="1.0" encoding="UTF-8" standalone="yes"?>"+
          "<country>"+
          "  <country_name>中国</country_name>"+
          "  <provinces>"+
          "    <province>"+
          "      <province_name>江苏省</province_name>"+
           "      <prov_city>南京市</prov_city>"+
          "    </province>"+
           "    <province>"+
           "      <province_name>浙江省</province_name>"+
           "      <prov_city>杭州市</prov_city>"+
           "    </province>"+
          "  </provinces>"+
          "</country>";
        Country country = JaxbUtil.converyToJavaBean(str, Country.class);
        System.out.println(country);
      }
    }
    

    输出结果分别为:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <country>
      <country_name>中国</country_name>
      <provinces>
        <province>
          <province_name>江苏省</province_name>
          <prov_city>南京市</prov_city>
        </province>
        <province>
          <province_name>浙江省</province_name>
          <prov_city>杭州市</prov_city>
        </province>
      </provinces>
    </country>
    
    Country [name=中国, provinceList=[Province [name=江苏省, provCity=南京市], Province [name=浙江省, provCity=杭州市]]] 
    

    在线JSON转Java Bean代码工具: 
    http://tools.jb51.net/code/json2javabean

    转载自:https://blog.csdn.net/u010502101/article/details/79586834

  • 相关阅读:
    2019年书单
    JMeter报错:Address already in use : connect
    读书笔记——弗洛伊德《梦的解析》
    Python3学习之路~10.3 论事件驱动与异步IO
    Python3学习之路~10.2 协程、Greenlet、Gevent
    nmon使用问题汇总(不定期更新)
    ( VIJOS )VOJ 1049 送给圣诞夜的礼品 矩阵快速幂
    POJ3233 Matrix Power Series 矩阵乘法
    NYOJ 298 点的变换 矩阵乘法
    HDU 5834 Magic boy Bi Luo with his excited tree 树形dp
  • 原文地址:https://www.cnblogs.com/abel-he/p/JAXB.html
Copyright © 2011-2022 走看看