利用JAXB实现java实体类和xml互相转换

1、应用场景

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

2、Demo

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

package jaxb;
import java.util.Date;
import java.util.List;
import java.util.Map;
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;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlType(propOrder={"id","name","age","birthDay","list","teacher","map"}) //指定序列成的xml节点顺序
@XmlAccessorType(value=XmlAccessType.FIELD)  //访问类型改为字段
@XmlRootElement
public class Student {
     @XmlElement
     private String id;
     @XmlElement
     private String name;
     @XmlElement
     private int age;
     @XmlJavaTypeAdapter(value=DateAdapter.class)
     @XmlElement
     private Date birthDay;
     @XmlElement
     private List<Teacher> list;
     @XmlElement
     private Teacher teacher;
     
     @XmlJavaTypeAdapter(value=MapAdapter.class)
    // @XmlElementWrapper(name="role")
     @XmlElement
     private Map map;
    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 int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    public Date getBirthDay() {
        return birthDay;
    }
    
    
    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }

    public List getList() {
        return list;
    }
  
    public void setList(List list) {
        this.list = list;
    }
  public Teacher getTeacher() {
    return teacher;
  }
   public void setTeacher(Teacher teacher) {
    this.teacher = teacher;
   }

  public Map getMap() {
    return map;
  }

  public void setMap(Map map) {
    this.map = map;
 }

@Override
public String toString() {
    return "Student [id=" + id + ", name=" + name + ", age=" + age
            + ", birthDay=" + birthDay + ", list=" + list + ", teacher="
            + teacher + ", map=" + map + "]";
}
 
}

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

package jaxb;

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(value=XmlAccessType.FIELD)
@XmlType(propOrder={"id","name","age"})
public class Teacher {
 @XmlElement
 private int id;
 @XmlElement
 private String name;
 @XmlElement
 private int age;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return age;
}
public void setAge(int age) {
    this.age = age;
}
public Teacher(int id, String name, int age) {
    super();
    this.id = id;
    this.name = name;
    this.age = age;
}
public Teacher() {
}
@Override
public String toString() {
    return "Teacher [id=" + id + ", name=" + name + ", age=" + age + "]";
}

}

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

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

package jaxb;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {
    //反序列化成日期对象Date
    @Override
    public Date unmarshal(String str) throws Exception {
        SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return str==null ? null:format.parse(str);
    }
//序列化成xmL @Override
public String marshal(Date date) throws Exception { SimpleDateFormat format = getSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return date==null ? "":format.format(date); } private SimpleDateFormat getSimpleDateFormat(String pattern){ SimpleDateFormat format = new SimpleDateFormat(pattern); return format; } }

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

package jaxb;

public class Entry {
  private String key;
  private Object value;
  public String getKey() {
    return key;
  }
  public void setKey(String key) {
    this.key = key;
  }
   public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
  
}

2.5、MapAdpter.java   map 转换器

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

package jaxb;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MapAdapter extends XmlAdapter<MapAdapter.AdapterMap,Map<String,Object>> {

    public static class AdapterMap {
        public List<Entry> entry =new ArrayList<Entry>();    
    }
    /**
     * 功能:xml->Map<String,Object>
     * @param adapterMap
     * @return
     * @throws Exception
     */
    @Override
    public Map<String, Object> unmarshal(AdapterMap adapterMap) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        List entry = adapterMap.entry;
        for(Entry en:adapterMap.entry){
            map.put(en.getKey(), en.getValue());
        }
        return map;
    }
    /**
     * 功能:map<String,Object> -> xml
     */
    @Override
    public AdapterMap marshal(Map<String, Object> map) throws Exception {
        AdapterMap adapterMap = new AdapterMap();
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            Entry entry2 = new Entry();
            entry2.setKey(entry.getKey());
            entry2.setValue(entry.getValue());
            adapterMap.entry.add(entry2);
        }
        return adapterMap;
    }

}

 2.6 测试类 JaxbDemo.java

package jaxb;

import java.io.StringReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JaxbDemo {
    
   public static void main(String[] args) {
       Student stu = new Student();
       stu.setId("1");
       stu.setName("罗志茂");
       stu.setAge(25);
       stu.setBirthDay(new Date());
       //list集合,set集合一样
       ArrayList<Teacher> list = new ArrayList<Teacher>();
       list.add(new Teacher(2,"曾利梅",22));
       list.add(new Teacher(3,"黄伙林",22));
       list.add(new Teacher(4,"潘志华",22));
       stu.setList(list);
       //在javaBean中添加javaBean
       Teacher teacher = new Teacher(1,"宋瑶",22);
       stu.setTeacher(teacher);
       //添加map集合
       HashMap<Object, Object> map = new HashMap<>();
       map.put("1", "林乐贤");
       map.put("2", "德甲");
       stu.setMap(map);
       try {
        JAXBContext context = JAXBContext.newInstance(Student.class);
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "GBK");
        //marshaller.marshal(stu, System.out);
        StringWriter writer = new StringWriter();
        marshaller.marshal(stu, writer);
        System.out.println(writer.toString());
        //反序列化
        Unmarshaller unmarshaller = context.createUnmarshaller();
        StringReader reader = new StringReader(writer.toString());
        Student stu2 = (Student) unmarshaller.unmarshal(reader);
        System.out.println("stu2"+stu2);
    } catch (JAXBException e) {
        e.getMessage();
        e.printStackTrace();
    }
   }
}

3.测试结果

<?xml version="1.0" encoding="GBK" standalone="yes"?>
<student>
    <id>1</id>
    <name>罗志茂</name>
    <age>25</age>
    <birthDay>2016-08-18 23:07:26</birthDay>
    <list>
        <id>2</id>
        <name>曾利梅</name>
        <age>22</age>
    </list>
    <list>
        <id>3</id>
        <name>黄伙林</name>
        <age>22</age>
    </list>
    <list>
        <id>4</id>
        <name>潘志华</name>
        <age>22</age>
    </list>
    <teacher>
        <id>1</id>
        <name>宋瑶</name>
        <age>22</age>
    </teacher>
    <map>
        <entry>
            <key>2</key>
            <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">德甲</value>
        </entry>
        <entry>
            <key>1</key>
            <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">林乐贤</value>
        </entry>
    </map>
</student>

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=林乐贤}]

 

posted @ 2016-08-18 23:09  坏~牧羊人  阅读(16636)  评论(0编辑  收藏  举报