jaxb的介紹,以及對jaxb的入門
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物件:
(Class... classesToBeBound) Obtain a new instance of a JAXBContext class. |
(Class[] classesToBeBound,
Map<String,?> properties) Obtain a new instance of a JAXBContext class. |
Obtain a new instance of a JAXBContext |
Obtain a new instance of a JAXBContext class. |
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屬性。
[email protected]
@XmlType用在class類的註解,常與@XmlRootElement,@XmlAccessorType一起使用。它有三個屬性:name、propOrder、namespace,經常使用的只有前兩個屬性。如:
@XmlType(name = "basicStruct", propOrder = { "intValue", "stringArray", "stringValue" )
在使用@XmlType的propOrder 屬性時,必須列出JavaBean物件中的所有屬性,否則會報錯。
[email protected]
@XmlElement將java物件的屬性對映為xml的節點,在使用@XmlElement時,可通過name屬性改變java物件屬性在xml中顯示的名稱。如:
@XmlElement(name="Address") private String yourAddress;[email protected]
@XmlRootElement用於類級別的註解,對應xml的跟元素,常與 @XmlType 和 @XmlAccessorType一起使用。如:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Address {}
[email protected]
@XmlAttribute用於把java物件的屬性對映為xml的屬性,並可通過name屬性為生成的xml屬性指定別名。如: @XmlAttribute(name="Country")private String state;
[email protected]
@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檔案。
[email protected]
@XmlAccessorOrder用於對java物件生成的xml元素進行排序。它有兩個屬性值:
AccessorOrder.ALPHABETICAL:對生成的xml元素按字母書序排序
XmlAccessOrder.UNDEFINED:不排序
[email protected]
@XmlTransient用於標示在由java物件對映xml時,忽略此屬性。即,在生成的xml檔案中不出現此元素。
[email protected]
@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;
@XmlElement
private Date calendar;
@XmlAttribute
private 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;
}
@Override
public 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 {
@XmlAttribute
private 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;
}
@Override
public 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;
}
@Override
public String toString() {
return "GeneratorsGroup [test=" + test + "]";
}
}
相關推薦
jaxb的介紹,以及對jaxb的入門
介紹順序按照:1. JAXB的介紹 2. JAXB中的核心類以及相關類介紹 3. JAXB中的常用註解介紹 4. 使用演示展示 首先介紹下什麼是JAXB? JAXB(Java Architecture for XML Binding) 是一項可以根據XML Sch
水平居中與垂直居中,以及對齊
代碼 布局 ott 水平居中 研究 背景圖 兼容性 vertical float 我以前一直都搞不清楚水平居中與垂直居中,更不用談什麽對齊,臨時抱佛腳,也找不到很好的答案,於是把網上的代碼研究了一番,總結一下經驗: 盒子水平居中:margin:0 auto 註意:在
Lucene.net(4.8.0) 學習問題記錄五: JIEba分詞和Lucene的結合,以及對分詞器的思考
+= d+ ext eth reac chart rdl ret start 前言:目前自己在做使用Lucene.net和PanGu分詞實現全文檢索的工作,不過自己是把別人做好的項目進行遷移。因為項目整體要遷移到ASP.NET Core 2.0版本,而Lucene使用的版本
python 讀寫json文件(dump, load),以及對json格式的數據處理(dumps, loads)
ref oat ati ID == 數據轉換 load() tro float JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式。它基於ECMAScript的一個子集。 1、json.dumps()和json.loads()
Map四種獲取key和value值的方法,以及對map中的元素排序(轉)
compareto map.entry 排序 區別 sta hashmap 得到 package log 獲取map的值主要有四種方法,這四種方法又分為兩類,一類是調用map.keySet()方法來獲取key和value的值,另一類則是通過map.entrySet()方法來
檢視Oracle的連線,以及對會話操作
#檢視當前不為空的連線select * from v$session where username is not null #檢視不同使用者的連線數 select username,count(username) from v$session where username
一覽Swift中的常用關鍵字 Swift - final關鍵字的介紹,以及使用場景
要學習Swift這門語言,就必須先了解Swift的關鍵字及對應的解釋。這裡就列一下在Swift中常用到的關鍵字。 關鍵字是類似於識別符號的保留字元序列,除非用重音符號(`)將其括起來,否則不能用作識別符號。關鍵字是對編譯器具有特殊意義的預定義保留識別符號。常見的關鍵字有以下4種。 與
[C++] STL庫函式之字串string::npos的介紹,以及string中的find函式~
npos經常和find一起用~它們兩個都在標頭檔案<string>裡面~先看用法: #include <iostream> #include <string> us
REDIS學習(4)spring boot redisTemplate 對REDIS的簡單封裝,以及對引用包的說明,以及對序列化的詳細說明
綜合1,2,3以及目前,我們所引用的redis包不過是 <dependency> <groupId>org.springframework.boot</groupId><!-- 會附帶引進jedis-2.7.3的包 -->
在Linux下使用makefile寫一個進度條,以及對\r 和\n,緩衝區的簡單瞭解
1.’\r’和‘\n’的區別 \r:表示回車:它只會回到這一行的最前邊 \n:表示回車換行。它會回到這一行的最前邊,然後跳到下一行 。 2.緩衝區 c函式如printf(),在輸出時,shell預設將資料輸出到標準輸出如顯示器,而printf()在
vue 項目總結,以及對未來的理解,對性能方面的認知
自動化處理 在一起 管理 模塊 寫法 註冊 個數 start 分析 之前自己寫了一個vue項目,因為沒有經驗,所以很多方面的提升做的不好,比如說路由、比如說ajax都沒有封裝,比如說業務邏輯和通用邏輯都混合在一起,導致大片大片重復的代碼累積。忽悠忽悠沒入門的前端感覺還是很好
對巨集觀的力學中連續介質假設的理解,以及對流體力學中平均速度的理解
對巨集觀的力學中連續介質假設的理解: 巨集觀的力學(如流體力學、彈塑性力學等)研究的物件是大量分子的集合,這時候每個集合構成一個個小微元體,整個物件就是由這無數個小微元體連續無間隙地構成。因為我們只需要關注每個集合上物件的性質,如密度、速度、應力、形變等,不需要
springboot整合mybatis-plus,以及mybatis-plus入門使用
mybatis-plus是基於mybatis,相對於mybatis,他有許多特性是比較好用的,比如分頁查詢、表字段自動轉換為實體類屬性等,使用mybatis-plus與Spring Data JPA有點相似的地方,個人覺得mybatis-plus的分頁比JPA的分頁好用。其實
Redis詳細介紹,以及在SpringBoot中的簡單使用
1.Redis的特點: (1)Redis支援資料的持久化,可以將記憶體中的資料儲存到磁碟中,下次啟動的時候可以直接載入磁碟中的資料; (2)Redis不僅可以儲存key-value型別的資料,還可以儲存List、Set、hash、zset等資料結構的資料;
過濾器通過HttpServletResponseWrapper包裝HttpServletResponse實現獲取response中的返回資料,以及對資料進行gzip壓縮
前幾天我們專案總監給了我一個任務,就是將請求的介面資料進行壓縮,以達到節省流量的目的。 對於實現該功能,有以下思路: 1.獲取到response中的值, 2.對資料進行gzip壓縮(因為要求前端不變,所以只能選在這個瀏覽器都支援的壓縮方式) 3.將資料寫
《連載 | 物聯網框架ServerSuperIO教程》- 14.配製工具介紹,以及裝置驅動、檢視驅動、服務例項的掛載
目 錄 14.配製工具介紹,以及裝置驅動、檢視驅動、服務例項的掛載... 2 14.1 概述... 2 14.2 掛載裝置驅動... 2 14.3 掛載顯示檢視... 4 14.4
Comet4j部署,以及對Jfinal以及Zcurd專案的支援
範例及所需基礎資源包請參考《參考連結》。對於基礎jar包及js,參考連結中為google連結,被牆的小夥伴可從以下連結下載: 2、部署注意事項: 1)、comet4j僅支援tomcat伺服器且目前僅支援6、7版本,8尚未考證,據說使用7的jar包也能支援。 2)
kafka基本原理介紹,以及重新選舉,replica複製機制,isr等。
最近做的專案,通過資料庫的log日誌將資料庫某些千萬量級的表(這些表需要聯表查詢)資料同步到elasticsearch中,以減輕資料庫的查詢壓力,其中以kafka作為訊息中介軟體,以下是做該專案過程中對kafka的一些整理。 一、中介軟體 中介軟體,用於業務對於資料的時效
異常處理 try...catch...finally 執行順序, 以及對返回值得影響
異常處理 try...catch...finally 執行順序, 以及對返回值得影響 結論:1、不管有沒有出現異常,finally塊中程式碼都會執行;2、當try和catch中有return時,finally仍然會執行;3、finally是在return後面的表示式運算後執行的(此時並沒有返回運算後的值,而
【無監督學習】DBSCAN聚類演算法原理介紹,以及程式碼實現
前言:無監督學習想快一點複習完,就轉入有監督學習 聚類演算法主要包括哪些演算法?主要包括:K-m