JAXB之xml与javabean的相互转换

1.JAXB常用注解

(1)@XmlRootElement

@XmlRootElement用于类级别的注解,对应xml的根元素,常与 @XmlType 和 @XmlAccessorType一起使用。

 

(2)@XmlType

@XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,其中propOrder属性用来指定序列成的xml节点顺序,在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。

 

(3)@XmlAccessorType

@XmlAccessorType用于指定由java对象生成xml文件时对java对象属性的访问方式。常与@XmlRootElement、@XmlType一起使用。它的属性值是XmlAccessType的4个枚举值,分别为:

  XmlAccessType.FIELD:java对象中的所有成员变量

  XmlAccessType.PROPERTY:java对象中所有通过getter/setter方式访问的成员变量

  XmlAccessType.PUBLIC_MEMBER:java对象中所有的public访问权限的成员变量和通过getter/setter方式访问的成员变量

  XmlAccessType.NONE:java对象的所有属性都不映射为xml的元素

  注意:@XmlAccessorType的默认访问级别是XmlAccessType.PUBLIC_MEMBER,因此,如果java对象中的private成员变量设置了public权限的getter/setter方法,就不要在private变量上使用@XmlElement和@XmlAttribute注解,否则在由java对象生成xml时会报同一个属性在java类里存在两次的错误。同理,如果@XmlAccessorType的访问权限为XmlAccessType.NONE,如果在java的成员变量上使用了@XmlElement或@XmlAttribute注解,这些成员变量依然可以映射到xml文件。

 

(4)@XmlElement

@XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。

 

(5)@XmlAttribute

@XmlAttribute用于把java对象的属性映射为xml的属性,并可通过name属性为生成的xml属性指定别名。

 

(6)@XmlTransient

@XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。

 

(7)@XmlJavaTypeAdapter

@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。

 

2.案例

@XmlType(propOrder={"id","name","age","birthday","teacherList","teacher","data","dataList"}) //指定序列成的xml节点顺序
@XmlAccessorType(value=XmlAccessType.FIELD)  //访问类型改为字段
@XmlRootElement   //根元素
public class Student {

    @XmlElement   //子元素
    private String id;

    @XmlElement
    private String name;

    @XmlElement
    private Integer age;

    @XmlElement
    @XmlJavaTypeAdapter(DateAdapter.class)
    private Date birthday;

    @XmlElementWrapper(name = "teacherList")
    @XmlElement(name= "teacher")
    private List<Teacher> teacherList;

    @XmlElement
    private Teacher teacher;

    @XmlElement
    @XmlJavaTypeAdapter(MapAdapter.class)
    private Map<String, String> data;

    @XmlElement
    @XmlJavaTypeAdapter(MapListAdapter.class)
    private List<Map<String, String>> dataList;

    @XmlAttribute  //Student根元素属性
    private Integer sex;

    @XmlTransient  //该属性不加入序列化/反序列化中
    private Float weight;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public List<Teacher> getTeacherList() {
        return teacherList;
    }

    public void setTeacherList(List<Teacher> teacherList) {
        this.teacherList = teacherList;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    public Map<String, String> getData() {
        return data;
    }

    public void setData(Map<String, String> map) {
        this.data = map;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Float getWeight() {
        return weight;
    }

    public void setWeight(Float weight) {
        this.weight = weight;
    }

    public List<Map<String, String>> getDataList() {
        return dataList;
    }

    public void setDataList(List<Map<String, String>> dataList) {
        this.dataList = dataList;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                ", teacherList=" + teacherList +
                ", teacher=" + teacher +
                ", data=" + data +
                ", dataList=" + dataList +
                ", sex=" + sex +
                ", weight=" + weight +
                '}';
    }

}

 

@XmlAccessorType(value=XmlAccessType.FIELD)
@XmlType(propOrder={"id","name","age"})
public class Teacher {

    @XmlElement
    private String id;
    @XmlElement
    private String name;
    @XmlElement
    private Integer age;

    public Teacher() {

    }

    public Teacher(String id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

 

/**
 * 自定义时间适配器类
 */
public class DateAdapter extends XmlAdapter<String, Date> {
    @Override
    public Date unmarshal(String str) throws Exception {
        SimpleDateFormat sdf = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return str == null ? null : sdf.parse(str);
    }

    @Override
    public String marshal(Date date) throws Exception {
        SimpleDateFormat sdf = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return date == null ? null : sdf.format(date);
    }

    private SimpleDateFormat getSimpleDateFormat(String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf;
    }
}

 

@XmlType(propOrder = {"key", "value"})
@XmlAccessorType(value=XmlAccessType.FIELD)
public class Entry {

    @XmlAttribute
    private String key;

    @XmlValue
    private String value;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

 

@XmlAccessorType(value=XmlAccessType.FIELD)
public class MapConvertor {
    @XmlElement(name="result")
    public List<Entry> entryList = new ArrayList<>();
}

 

public class MapAdapter extends XmlAdapter<MapConvertor, Map<String, String>> {

    @Override
    public Map<String, String> unmarshal(MapConvertor mapConvertor) throws Exception {
        Map<String, String> map = new HashMap<>();
        if (mapConvertor != null) {
            List<Entry> entryList = mapConvertor.entryList;
            for (Entry entry : entryList) {
                map.put(entry.getKey(), entry.getValue());
            }
            return map;
        }

        return null;
    }

    @Override
    public MapConvertor marshal(Map<String, String> map) throws Exception {
        MapConvertor mapConvertor = new MapConvertor();
        if (map != null) {
            for (Map.Entry<String, String> entry : map.entrySet()) {
                Entry en = new Entry();
                en.setKey(entry.getKey());
                en.setValue(entry.getValue());
                mapConvertor.entryList.add(en);
            }
            return mapConvertor;
        }

        return null;
    }
}

 

@XmlAccessorType(value=XmlAccessType.FIELD)
public class MapListConvertor {
    @XmlElement(name="resultList")
    public List<MapConvertor> mapList = new ArrayList<>();
}

 

public class MapListAdapter extends XmlAdapter<MapListConvertor, List<Map<String, String>>> {

    private MapAdapter mapAdapter = new MapAdapter();

    @Override
    public List<Map<String, String>> unmarshal(MapListConvertor mapListConvertor) throws Exception {
        List<Map<String, String>> mapList = new ArrayList<>();
        if (mapListConvertor != null) {
            List<MapConvertor> list = mapListConvertor.mapList;
            for (MapConvertor mapConvertor : list) {
                Map<String, String> map = this.mapAdapter.unmarshal(mapConvertor);
                mapList.add(map);
            }
            return mapList;
        }

        return null;
    }

    @Override
    public MapListConvertor marshal(List<Map<String, String>> mapList) throws Exception {
        MapListConvertor mapListConvertor = new MapListConvertor();
        if (mapList != null) {
            for (Map<String, String> map : mapList) {
                MapConvertor mapConvertor = this.mapAdapter.marshal(map);
                mapListConvertor.mapList.add(mapConvertor);
            }
            return mapListConvertor;
        }

        return null;
    }
}

 

public class Main {

    public static void main(String[] args) {
        Student stu = new Student();
        initData(stu);

        try {
            //javabean转换为xml
            JAXBContext context = JAXBContext.newInstance(Student.class);
            Marshaller marshaller = context.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
            StringWriter writer = new StringWriter();
            marshaller.marshal(stu, writer);
            System.out.println(writer.toString());

            //xml转换为javabean
            JAXBContext context2 = JAXBContext.newInstance(Student.class);
            Unmarshaller unmarshaller = context2.createUnmarshaller();
            String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
                    "<student sex=\"0\">\n" +
                    "    <id>007</id>\n" +
                    "    <name>小西</name>\n" +
                    "    <age>25</age>\n" +
                    "    <birthday>2018-12-01 16:12:02</birthday>\n" +
                    "    <teacherList>\n" +
                    "        <teacher>\n" +
                    "            <id>1</id>\n" +
                    "            <name>小明</name>\n" +
                    "            <age>22</age>\n" +
                    "        </teacher>\n" +
                    "        <teacher>\n" +
                    "            <id>2</id>\n" +
                    "            <name>小红</name>\n" +
                    "            <age>22</age>\n" +
                    "        </teacher>\n" +
                    "        <teacher>\n" +
                    "            <id>3</id>\n" +
                    "            <name>小志</name>\n" +
                    "            <age>22</age>\n" +
                    "        </teacher>\n" +
                    "    </teacherList>\n" +
                    "    <teacher>\n" +
                    "        <id>1</id>\n" +
                    "        <name>佳佳</name>\n" +
                    "        <age>22</age>\n" +
                    "    </teacher>\n" +
                    "    <data>\n" +
                    "        <result key=\"1\">小罗</result>\n" +
                    "        <result key=\"2\">小嘉</result>\n" +
                    "        <result key=\"3\">小敏</result>\n" +
                    "    </data>\n" +
                    "    <dataList>\n" +
                    "        <resultList>\n" +
                    "            <result key=\"1\">小罗</result>\n" +
                    "            <result key=\"2\">小嘉</result>\n" +
                    "            <result key=\"3\">小敏</result>\n" +
                    "        </resultList>\n" +
                    "        <resultList>\n" +
                    "            <result key=\"1\">小周</result>\n" +
                    "            <result key=\"2\">小蕾</result>\n" +
                    "        </resultList>\n" +
                    "    </dataList>\n" +
                    "</student>";
            Student s = (Student) unmarshaller.unmarshal(new StringReader(xmlStr));
            System.out.println(s.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void initData(Student stu) {
        stu.setId("007");
        stu.setName("小西");
        stu.setAge(25);
        stu.setBirthday(new Date());
        stu.setSex(0);
        stu.setWeight(62.5f);
        //list集合,set集合一样
        ArrayList<Teacher> list = new ArrayList<>();
        list.add(new Teacher("1","小明",22));
        list.add(new Teacher("2","小红",22));
        list.add(new Teacher("3","小志",22));
        stu.setTeacherList(list);
        //在javaBean中添加javaBean
        Teacher teacher = new Teacher("1","佳佳",22);
        stu.setTeacher(teacher);
        //添加map集合
        Map<String, String> map = new HashMap<>();
        map.put("1", "小罗");
        map.put("2", "小嘉");
        map.put("3", "小敏");
        stu.setData(map);
        //添加map泛型的list
        List<Map<String, String>> dataList = new ArrayList<>();
        Map<String, String> map2 = new HashMap<>();
        map2.put("1", "小周");
        map2.put("2", "小蕾");
        dataList.add(map);
        dataList.add(map2);
        stu.setDataList(dataList);
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值