java利用JAXB实现对象和xml互相转换方法与实例详解

2020-02-20 20:02:06王冬梅

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();
  }
  }
}