JAXB工具实现java实体类和xml之间的转换
来源:互联网 发布:网络上贷款需要些什么 编辑:程序博客网 时间:2024/04/30 00:15
1、应用场景
1、在使用WebService实现数据上传下载,数据查询时,可以利用JAXB实现java实体类和xml互相转换
2、可以使用jersey框架实现WebService接口(resetful方式)
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) //访问类型改为字段@XmlRootElementpublic 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; }@Overridepublic 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() {}@Overridepublic 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=林乐贤}]
0 0
- JAXB工具实现java实体类和xml之间的转换
- jaxB实体类和xml之间的转换
- 利用JAXB实现java实体类和xml互相转换
- Jaxb实现Java对象与XML之间的转换
- 使用JAXB来实现Java合xml之间的转换
- JAXB实现JAVA BEAN与XML之间的转换
- java对象和xml之间转换--Jaxb
- JAXB中Java对象和XML之间的转换
- 利用JAXB实现java对象和xml的相互转换
- JAXB实现JAVA对象和XML字符串的互相转换
- xml-xml与java对象之间的转换(jaxb)
- JAXB 实现java对象与xml之间互相转换(一)
- JAXB 实现java对象与xml之间互相转换(二)
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- JAXB 实现java对象与xml之间互相转换
- (c++)输入10个数字,然后逆序输出。
- Android studio隐藏app应用图标
- 关于jdbc连接oracle的一些坑
- Deques
- word2vec 入门基础(一)
- JAXB工具实现java实体类和xml之间的转换
- Coin2.0万能卡将上线 取代你钱包中的所有银行卡
- C++ 资源大全
- java中的静态和动态代理模式
- 如何解决VS2010 MySql Connect C 链接mysql:error LNK2019: 无法解析外部符号的问题
- IDEA 加载 tld文件(IntelliJ IDEA使用JSTL标签库)
- 串口设备驱动相关事件的掩码定义(IOCTL_SERIAL_GET_WAIT_MASK)
- linux cfs调度器
- 解决用notifyDataSetChanged动态刷新ListView无效的问题