JAXB轻松转换xml对象和java对象
实体类如下:
package com.cn.entity; 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; @XmlRootElement(name = "person")
@XmlAccessorType(XmlAccessType.NONE)
public class Person { //姓名
@XmlElement(name = "newName")
private String name; //性别
@XmlElement(name = "sex_1")
private String sex; //年龄
@XmlElement
private int age; //地址
@XmlElementWrapper(name = "Address")
@XmlElement(name = "address")
private List<Address> Address; get...
set...
}
package com.cn.entity; import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(propOrder={"country","province","city","county","town"})
public class Address { //国
//@XmlElement(name = "country000")
private String country;
//省
//@XmlElement
private String province;
//市
//@XmlElement
private String city;
//县
//@XmlElement
private String county;
//镇
//@XmlElement(required = true)
private String town; get...
set...
}
JAXB工具类:
package com.cn.util; import java.io.StringReader;
import java.io.StringWriter; import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller; import org.apache.log4j.Logger; /**
* JAXB工具类
* @author sun.kai
* 2016年8月18日
*/
public class JaxbUtil {
private static Logger logger = Logger.getLogger(JaxbUtil.class);
private static JAXBContext jaxbContext; //xml转java对象
@SuppressWarnings("unchecked")
public static <T> T xmlToBean(String xml,Class<T> c){
T t = null;
try {
jaxbContext = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (JAXBException e) {
logger.info(e.getMessage());
}
return t;
} //java对象转xml
public static String beanToXml(Object obj){
StringWriter writer = null;
try {
jaxbContext=JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = jaxbContext.createMarshaller();
//Marshaller.JAXB_FRAGMENT:是否省略xml头信息,true省略,false不省略
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
//Marshaller.JAXB_FORMATTED_OUTPUT:决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml)
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//Marshaller.JAXB_ENCODING:xml的编码方式
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
writer = new StringWriter();
marshaller.marshal(obj, writer);
} catch (JAXBException e) {
logger.info(e.getMessage());
}
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + writer.toString();
}
}
测试用例:
package com.test.test; import java.util.ArrayList;
import java.util.List; import com.cn.entity.Address;
import com.cn.entity.Person;
import com.cn.util.JaxbUtil; public class TestJaxb { public static void main(String[] args) {
long time1 = System.currentTimeMillis();
//测试java对象转xml,java对象中包含集合对象
Person person = new Person();
person.setName("admin管理员");
person.setSex("男");
person.setAge(25);
List<Address> adds = new ArrayList<Address>();
Address address1 = new Address();
address1.setCountry("中国");
address1.setProvince("安徽");
address1.setCity("宿州");
address1.setCounty("萧县");
Address address2 = new Address();
address2.setCountry("中国");
address2.setProvince("上海");
address2.setCity(null);
address2.setCounty("");
adds.add(address1);
adds.add(address2);
person.setAddress(adds);
String xml = JaxbUtil.beanToXml(person);
System.out.println(xml); //测试xml转java对象
Person person2 = JaxbUtil.xmlToBean(xml,Person.class);
System.out.println(person2.getAddress().get(0).getCountry());
System.out.println(person2.getAddress().get(1).getProvince()); long time2 = System.currentTimeMillis();
System.out.println((time2-time1)+"ms");
}
}
执行后控制台打印:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<newName>admin管理员</newName>
<sex_1>男</sex_1>
<age>25</age>
<Address>
<address>
<country>中国</country>
<province>安徽</province>
<city>宿州</city>
<county>萧县</county>
</address>
<address>
<country>中国</country>
<province>上海</province>
<county></county>
</address>
</Address>
</person>
中国
上海
531ms
总结:
(1) @XmlRootElement:根节点,且可以增加属性(name="NewRootElementName"),那么生成的xml串的标签别名是NewRootElementName。
(2) @XmlAttribute:该属性作为xml的属性,且可以增加属性(name="NewAttributeName"),那么生成的xml串的标签别名是NewAttributeName。
(3) @XmlElement:该属性作为xml的元素,且可以增加属性(name="NewElementName"),那么生成的xml串的标签别名是NewElementName。
(4) @XmlElementWrapper:对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器。如果不加该注解,集合中的每个对象的父节点不是List了,而是Class。
(5) @XmlType,将Java类或枚举类型映射到XML模式类型。
(6) @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。
XmlAccessType.FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML,即使在java对象中的属性上不加注解@XmlElement等也可以转成XML对象。
XmlAccessType.NONE表示JAXB不自动绑定属性字段到XML,所以需要在需要转换的属性上加上注解@XmlElement才能转成XML对象。
XmlAccessType.PROPERTY表示只有属性(有get/set方法)才能被转换成XML中的标签,并且属性上不许有注解@XmlElement等,除非用@XmlTransient注释。
XmlAccessType.PUBLIC_MEMBER表示每个公共(public)获取(get)方法/设置(set)方法对和每个公共字段将会自动绑定到 XML,除非由@XmlTransient注释。
(7) @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
(8) @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML
(9) 对于根节点中的对象,在该对象类上用@XmlRootElement设置别名没有作用。
JAXB轻松转换xml对象和java对象的更多相关文章
- XML字符串和JAVA对象之间的转化
1.JAXB中相关的注解.类和接口说明 JAXB 中主要的一些注解 - shenyunsese 的专栏 - CSDN 博客 注:教程很全面很详细.但是仅供参考. 主要疑问区分和说明: 1.1 @X ...
- java json数据转List对象的集合-----阿里巴巴插件---及原生json---JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】
List<RunfastFullLess> list=(List<RunfastFullLess>)JSONArray.parseObject(activity.getFull ...
- JSON串、JSON对象、Java对象的相互转换
对象类型转换2: com.alibaba.fastjson.JSONObject时经常会用到它的转换方法,包括Java对象转成JSON串.JSON对象,JSON串转成java对象.JSON对象,JSO ...
- JSON串、JSON对象、Java对象的相互转换2
对象类型转换: 1.Java对象-->JSON对象2.Java对象-->JSON字符串 3.JSON对象-->JSON字符串 4.JSON对象-->Java对象 5.JSON字 ...
- XStream轻松转换xml和java对象
首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- Spring 整合 Flex (BlazeDS)无法从as对象 到 Java对象转换的异常:org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'java.util.Date' to required type 'java.sql.Timestamp' for property 'wfsj'; nested exception is java.lang.Ill
异常信息如下: org.springframework.beans.ConversionNotSupportedException: Failed to convert property value ...
- Java对象转xml报文和xml报文转Java对象帮助类
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marsha ...
- 转载-------- JSON 与 对象 、集合 之间的转换 JSON字符串和java对象的互转【json-lib】
转载--*--*---- 在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML.JSON等,JSON作为一个轻量级的数据格式比xml效率要高,XML需要很多的标签,这无疑占据了网络流量,J ...
随机推荐
- maven常用依赖总结
Apache工具组件 <!-- 字符串处理 --> <dependency> <groupId>org.apache.commons</groupId> ...
- IntelliJ Idea 常用快捷键列表和快速输入
IntelliJ Idea 常用快捷键列表和快速输入 快速输入查看 最常用快捷键 Alt+Enter 万能快捷键,用于引入错误包 Ctrl+ Mouse left 快速调转定义 快捷键 Ctrl+Sh ...
- 【洛谷P1363】幻象迷宫
P1363 幻想迷宫 显然,若从原图中起点走到相邻的图中对应的"起点"位置 ,就可以无限走下去, 若一个点从原图中可以到达,到了非原图中也可以到达,就可以无限走下去 我们不妨记录下 ...
- Java8函数之旅 (六) -- 使用lambda实现Java的尾递归
前言 本篇介绍的不是什么新知识,而是对前面讲解的一些知识的综合运用.众所周知,递归是解决复杂问题的一个很有效的方式,也是函数式语言的核心,在一些函数式语言中,是没有迭代与while这种概念的,因为此类 ...
- Vue node.js商城-购物车模块
一.渲染购物车列表页面 新建src/views/Cart.vue获取cartList购物车列表数据就可以在页面中渲染出该用户的购物车列表数据 data(){ return { car ...
- TCP和UDP的现实应用
以下应用的区分是基于TCP可靠传输,UDP不可靠传输 TCP一般用于文件传输(FTP HTTP 对数据准确性要求高,速度可以相对慢),发送或接收邮件(POP IMAP SMTP 对数据准确性要求高,非 ...
- 嵌入式:UCOSIII的使用(17.01.24补充)
0.一些移植.系统相关 OS_CFG_APP.H /* --------------------- MISCELLANEOUS ------------------ */ #define OS_CFG ...
- xcode运行时候 You don’t have permission.
xcode 不能运行,提示没有权限 是因为使用第三方框架有plist文件存在
- c# 开发可替换的通用序列化库
开篇继续吹牛.... 其实没有什么可吹的了,哈哈哈哈哈 主要是写一个通用库,既可以直接用,又方便替换,我的序列化都是采用第三方的哈. 我不上完整代码了,只是给大家讲讲过程. 1.写一个序列化的类,我是 ...
- flask笔记(二)
Flask中的路由 查看整个flask中的路由映射关系 app.url_map from flask import Flask app = Flask(__name__) @app.route(&qu ...