jaxb的介绍,以及对jaxb的入门
来源:互联网 发布:cpda数据分析师 假 编辑:程序博客网 时间:2024/06/05 08:23
1. JAXB的介绍
2. JAXB中的核心类以及相关类介绍
3. JAXB中的常用注解介绍
4. 使用演示展示
首先介绍下什么是JAXB?
JAXB(Java Architecture for XML Binding) 是一项可以根据XML Schema产生Java类的技术。 该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。Jaxb 2.0是JDK 1.6的组成部分。我们不需要下载第三方jar包 即可做到轻松转换。
JAXB的核心类有如下三个:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
该类不能直接创建,只能使用如下方式进行实例化JAXBContext对象:
static JAXBContext
newInstance(Class... classesToBeBound)
Obtain a new instance of a JAXBContext class.
static JAXBContext
newInstance(Class[] classesToBeBound,Map<String,?> properties)
Obtain a new instance of a JAXBContext class.
static JAXBContext
newInstance(String contextPath)
Obtain a new instance of a JAXBContext class.
static JAXBContext
newInstance(String contextPath,ClassLoader classLoader)
Obtain a new instance of a JAXBContext class.
static JAXBContext
newInstance(String contextPath,ClassLoader classLoader, Map<String,?> properties)
Obtain a new instance of a JAXBContext class.
Marshaller接口,将Java对象序列化为XML数据。
该类是设置转换为XML数据的熟悉如格式化输出xml,设备xml的编码格式等:
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);
Unmarshaller接口,将XML数据反序列化为Java对象。
反序列化java对象需要用到的实例:
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
使用JAXB常用的注解如下:
- @XmlType,将Java类或枚举类型映射到XML模式类型
- @XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标 注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
- @XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
- @XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
- @XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。
- @XmlRootElement,将Java类或枚举类型映射到XML元素。
- @XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
- @XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
1.@XmlType
@XmlType用在class类的注解,常与@XmlRootElement,@XmlAccessorType一起使用。它有三个属性:name、propOrder、namespace,经常使用的只有前两个属性。如:
@XmlType(name = "basicStruct", propOrder = { "intValue", "stringArray", "stringValue")
在使用@XmlType的propOrder 属性时,必须列出JavaBean对象中的所有属性,否则会报错。
2.@XmlElement
@XmlElement将java对象的属性映射为xml的节点,在使用@XmlElement时,可通过name属性改变java对象属性在xml中显示的名称。如:
3.@XmlRootElement
@XmlRootElement用于类级别的注解,对应xml的跟元素,常与 @XmlType 和 @XmlAccessorType一起使用。如:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Address {}
4.@XmlAttribute
private String state;
5.@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文件。
6.@XmlAccessorOrder
@XmlAccessorOrder用于对java对象生成的xml元素进行排序。它有两个属性值:
AccessorOrder.ALPHABETICAL:对生成的xml元素按字母书序排序
XmlAccessOrder.UNDEFINED:不排序
7.@XmlTransient
@XmlTransient用于标示在由java对象映射xml时,忽略此属性。即,在生成的xml文件中不出现此元素。
8.@XmlJavaTypeAdapter
@XmlJavaTypeAdapter常用在转换比较复杂的对象时,如map类型或者格式化日期等。使用此注解时,需要自己写一个adapter类继承XmlAdapter抽象类,并实现里面的方法。
@XmlJavaTypeAdapter(value=xxx.class),value为自己定义的adapter类
XmlAdapter如下:
public abstract class XmlAdapter<ValueType,BoundType> { // Do-nothing constructor for the derived classes. protected XmlAdapter() {} // Convert a value type to a bound type. public abstract BoundType unmarshal(ValueType v); // Convert a bound type to a value type. public abstract ValueType marshal(BoundType v); }
演示DEMO
工具类:
package com.lgy.xml;import java.io.StringReader;import java.io.StringWriter;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;public class JaxbUtil {/** * JavaBean转换成xml * 默认编码UTF-8 * @param obj * @param writer * @return */ public static String convertToXml(Object obj) { return convertToXml(obj, "UTF-8"); } /** * JavaBean转换成xml * @param obj * @param encoding * @return */ public static String convertToXml(Object obj, String encoding) { String result = null; try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding); marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false); StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); result = writer.toString(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * xml转换成JavaBean * @param xml * @param c * @return */ @SuppressWarnings("unchecked") public static <T> T converyToJavaBean(String xml, Class<T> c) { T t = null; try { JAXBContext context = JAXBContext.newInstance(c); Unmarshaller unmarshaller = context.createUnmarshaller(); t = (T) unmarshaller.unmarshal(new StringReader(xml)); } catch (Exception e) { e.printStackTrace(); } return t; } }
简单类型:
package com.lgy.xml;import java.util.Date;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name="xmlDemo")@XmlType(propOrder = { "author", "calendar", "price"})public class XmlDemo {@XmlElement(required = true)private String author;@XmlElement(name = "price_1", required = true)private float price;@XmlElementprivate Date calendar;@XmlAttributeprivate Integer id;public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public float getPrice() {return price;}public void setPrice(float price) {this.price = price;}public Date getCalendar() {return calendar;}public void setCalendar(Date calendar) {this.calendar = calendar;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Overridepublic String toString() {return "XmlDemo [author=" + author + ", price=" + price + ", calendar=" + calendar + ", id=" + id + "]";}}
复杂类型:
package com.lgy.xml;import java.util.List;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlType;@XmlAccessorType(XmlAccessType.FIELD)@XmlRootElement(name="Generators")@XmlType(propOrder = {"generatorsGroups"})public class Generators {@XmlAttributeprivate Integer id;@XmlElement(required = true)private List<GeneratorsGroup> generatorsGroups;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public List<GeneratorsGroup> getGeneratorsGroups() {return generatorsGroups;}public void setGeneratorsGroups(List<GeneratorsGroup> generatorsGroups) {this.generatorsGroups = generatorsGroups;}@Overridepublic String toString() {return "Generators [id=" + id + ", generatorsGroups=" + generatorsGroups + "]";}}
package com.lgy.xml;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(XmlAccessType.FIELD)@XmlType(propOrder = {"test"})public class GeneratorsGroup {@XmlElement(required = true)private String test;public String getTest() {return test;}public void setTest(String test) {this.test = test;}@Overridepublic String toString() {return "GeneratorsGroup [test=" + test + "]";}}
- jaxb的介绍,以及对jaxb的入门
- Jaxb对XML的解析
- jaxb 的使用介绍[转载]
- JAXB的用法及介绍
- jdom的介绍以及与jaxb的比较
- Spring的Web-service和JAXB介绍
- Spring的Web-service和JAXB介绍
- JAXB的使用(快速入门)
- JAXB入门
- JAXB入门
- JAXB入门
- jaxb入门
- JAXB技术的魔力
- JAXB的使用方法
- 简单的jaxb例子
- JAXB的使用
- 控制JAXB的输入输出
- JAXB的使用
- 个人借鉴网上爬虫代码改写的py
- 查看当前网站的cookie快捷方法
- ActiveMQ发布订阅模式
- MySQL的if,case语句使用总结
- Python 实例方法、@staticmethod和@classmethod
- jaxb的介绍,以及对jaxb的入门
- iOS 定位一闪而过bug
- 不忘初心,方得始终
- CTP源码分析6 CTP链路质量估计层结构及源码分析(五)----源码实现解读(二)
- 设计模式之抽象工厂模式
- 如何保证Web服务器安全
- 无新浪微博客户端时分享的问题
- malloc
- 【react-native-0.31-iOS】封装原生组件并调用(02)