XStream實現xml和java物件之間的互相轉換(包括對屬性,別名,下劃線_的處理),同理JSON也可以
首先去官網下載響應JAR包
最少需要兩個jar包,一個xstream.jar,一個是xmlpull.jar
首先來看下java物件到xml的轉換
package xml; class PhoneNumber { private int code; private int number; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } } public class Person { private String username; private int age; private PhoneNumber pn; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public PhoneNumber getPn() { return pn; } public void setPn(PhoneNumber pn) { this.pn = pn; } }
以上是一個普通的java物件
package xml; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.StaxDriver; public class XmlUtils { private static XStream xs = new XStream(new StaxDriver()); public static String objToXml(Object obj) { //xs.aliasPackage(name, pkgName); return xs.toXML(obj); } public static void main(String[] args) { Person p = new Person(); p.setAge(26); p.setUsername("chiwei"); PhoneNumber pn = new PhoneNumber(); pn.setCode(188); pn.setNumber(67101080); p.setPn(pn); xs.alias("person", Person.class); String xml = objToXml(p); Person per = (Person)xs.fromXML(xml); System.out.println(xml); System.out.println(per.getUsername()); } }
以上程式碼,先是生成一個物件,給各個屬性賦值,然後呼叫toXML將物件轉換為xml格式的普通文字,注意在轉換前呼叫了alias目的是為了將xml.Person重新命名為person
<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>
這裡xstream例項化時候傳入了StaxDriver表示A driver using the StAX API to create XML reader and writer.
如果你使用xpp3driver,你需要引入該jar包
後面則根據上面轉換後的xml繼續轉換成相應的物件Person
<?xml version="1.0" ?><person><username>chiwei</username><age>26</age><pn><code>188</code><number>67101080</number></pn></person>
chiwei
很簡單
xs.alias("person", Person.class);
xs.useAttributeFor(Person.class,"username");
xs.aliasAttribute(Person.class, "username","name");
這種情況是將屬性寫到XML元素的裡面作為屬性,而不是單獨作為一個子元素,如下所示:
<person name="chiwei">
<age>26</age>
</person>
-------------------------------------------------------------------------------華麗的分割線-------------------------------------------------------------------------------------------
以上的例子的確很簡單,下面看看一些別的處理
xs.aliasField("res_type", SLIR.class, "resType");
該方法是用於將SLIR類中的resType屬性在XML元素中顯示為res_type,這裡看到有一個下劃線_,其實在xstream例項化的時候,如果沒有用到XmlFriendlyNameCoder的話,可能下劃線_就會變成__,因為在這裡_其實是轉移符,所以我們例項化xstream的時候應該如下:
private static XStream xs = new XStream(new DomDriver(null,new XmlFriendlyNameCoder("_-", "_")));
xs.useAttributeFor(RequestMode.class, "type");
該方法的目的是將RequestMode類中的type屬性作為該XML元素的內部屬性
<requestmode type="PASSIVE"/>
最後再來看下,XML元素同時又屬性和值得時候怎麼處理
<msid enc="ASC" type="MSISDN">13505602768</msid>
如上所示,msid元素擁有兩個屬性,同時又擁有自己的值,這時候,在做轉化的時候,必須自定義轉換器converter才行
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
public class ReqMsidConverter implements Converter {
@SuppressWarnings("rawtypes")
@Override
public boolean canConvert(Class type) {
// TODO Auto-generated method stub
return type.equals(Msid.class);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
// TODO Auto-generated method stub
Msid msid = (Msid)source;
writer.addAttribute("enc", msid.getEnc());
writer.addAttribute("type", msid.getType());
writer.setValue(msid.getMsid());
}
@Override
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
// TODO Auto-generated method stub\
Msid msid = new Msid();
msid.setEnc(reader.getAttribute("enc"));
msid.setType(reader.getAttribute("type"));
msid.setMsid(reader.getValue());
return msid;
}
}
定義完該轉換器後,將其註冊到xstream上即可
xs.registerConverter(new ReqMsidConverter());
List列表資料的轉換
public static String obj2XML(Object obj) {
xs.alias("InterBOSS", InterBOSS.class);
xs.aliasField("SvcCont", InterBOSS.class, "svcCont");
xs.aliasField("OrderInfoRsp", SvcCont.class,"orderInfoRsp");
xs.aliasField("FileStatus", SvcCont.class,"fileStatus");
xs.aliasField("RecNum", OrderInfoRsp.class,"recNum");
xs.aliasField("SuccNum", OrderInfoRsp.class,"succNum");
xs.aliasField("FailNum", OrderInfoRsp.class,"failNum");
xs.addImplicitArray(OrderInfoRsp.class, "pmList", ProductMember.class);
xs.alias("ProductMember", ProductMember.class);
xs.aliasField("MemberNumber", ProductMember.class,"memberNumber");
xs.aliasField("ProductOrderInfo", ProductMember.class,"productOrderInfo");
xs.aliasField("Extend", ProductMember.class,"extend");
xs.aliasField("RspCode", ProductMember.class,"rspCode");
xs.aliasField("RspDesc", ProductMember.class,"rspDesc");
return xs.toXML(obj);
}
這裡的列表就是ProductMember這個元素,它有多個,這裡就注意需要使用一個api-->addImplicitArray
相關推薦
XStream實現xml和java物件之間的互相轉換(包括對屬性,別名,下劃線_的處理),同理JSON也可以
首先去官網下載響應JAR包 最少需要兩個jar包,一個xstream.jar,一個是xmlpull.jar 首先來看下java物件到xml的轉換 package xml; class PhoneNumber { private int code;
JAXB實現XML和java物件互轉以及soapXml和物件互轉需要注意的地方
public class JaxbXmlUtil { private static final String DEFAULT_ENCODING = "UTF-8"; /** * pojo轉換成xml 預設編碼UTF-8 */ public static
JSON和JAVA物件之間的轉換小結
JSON(JAVAScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。它基於歐洲計算機協會制定的js規範的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。 1.為了便於轉換,需要
AXIS2中OMElement和Java物件之間的轉換 分享
最近在使用AXIS2部署Web Service,關於如果使用axis2部署Web Service的方法不想在這裡多說,網站有很多相關的文章,這裡只想談談AXIOM物件與Java中的物件的轉換方法。 關於AXIOM的介紹,下面這個片段已經說得很明白了: AXIOM AXIs 物件模型 (AXIOM) 是一
XStream輕鬆轉換xml和java物件
首先引入所需的jar: xstream-1.4.9、xpp3_min-1.1.4c、dom4j-1.6.1, 或用maven管理jar包時在pom.xml中新增: <!-- https://mvnrepository.com/artifact/com.thought
java物件和json物件之間互相轉換
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import net.sf.json.JSONArray;
Golang 奇葩的時間包之Json與struct物件之間互相轉換,JsonDate和JsonTime自定義型別如何實現json編碼和解碼(二)
本篇在專案中實用性極強,推薦珍藏 package main import ( "encoding/json" "fmt" "time" ) type JsonDate time.Time type JsonTime time.Time func (
使用XStream是實現XML與Java物件的轉換(6)--持久化
九、持久化 在第八節的示例中,當我們操作一組物件時,我們可以指定Writer、OutputStream來寫出序列化後的XML資料,我們還可以指定Reader、InputStream來讀取序列化後的XML資料。當我們需要寫出和讀取檔案時都需要指定輸入輸出流,並且需要明確的呼叫輸入輸出方法來實現Java物件的序
使用XStream是實現XML與Java物件的轉換(2)--別名
五、使用別名(Alias) 首先,有這樣一段Java程式碼: import java.util.ArrayList; import java.util.List; import com.thoughtworks.xstream
Java關於實體物件和Map物件之間的轉換
/** * 實體物件轉成Map * @param obj 實體物件 * @return */ public static Map<String, Object> object2Map(Object obj) { Ma
javax.xml + java.io xml和java物件互轉工具類
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshall
陣列和物件之間互相轉換的方法
/** * 陣列 轉 物件 * * @param array $arr 陣列 * @return object */ function array_to_object($arr) {
用JAXB轉換XML和Java物件時的迴圈引用問題的解決方法
利用JAXB可以實現XML與Java物件之間的轉換。在轉換時,可能會遇到交叉引用的情況,如果不做處理,提示為: A cycle is detected in the object graph. This will cause infinitely deep
JDK自帶XML和java物件相互轉換
下面使用的是JDK自帶的類,沒有引用任何第三方jar包。Unmarshaller 類使客戶端應用程式能夠將 XML 資料轉換為 Java 內容物件樹。備註:marshal(序列化、排列、整理)Marshaller 類使客戶端應用程式能夠將 Java 內容樹轉換回 XML 資料
xml與java物件之間的相互轉化
Java和xml的互相轉換,依靠強大的JAXBContext可以輕鬆實現。 下面通過一個簡單案例學習一下JAXBContext 首先準備好一個JavaBean供實驗: 注意 1、類檔案註解:@XmlRootElement不可缺少 2、2個Student的構造方法不能少
Json字串和js物件之間的轉換
Json字串和js物件之間的轉換 JSON.stringify()將js物件轉為json字串 JSON.parse()將JSON字串轉為js物件 補充(json物件和json字串的區別) json 字串 var str1 = '{ "nam
JSON與Java物件的互相轉換
JSON與Java物件的互相轉換 例一(單個物件進行賦值): @RequestMapping("test1.do") @ResponseBody public JSONObject test1(HttpServletRequest request, HttpServletResponse
C++實現utf8和gbk編碼字串互相轉換
不同系統或者伺服器之間訊息傳遞經常遇到編碼轉換問題,這裡用C++實現了一個輕量的gbk和utf8互相轉換,可跨平臺使用。(重量級的可以用libiconv庫) 在windows下用<windows.h>標頭檔案裡的函式進行多位元組和寬字元轉換,linu
json和java物件的相互轉換(json-lib和Gson的使用)
在java開發中時常會遇到json與java物件轉換的情況,比如說一般介面呼叫返回的都是json格式的,我們要取出來用就得把它解析成我們想要的格式,有時候我們傳遞引數又需要把引數封裝成json。這兩天
JSON資料和Java物件的相互轉換
* JSON解析器: * 常見的解析器:Jsonlib,Gson,fastjson,jackson 1. JSON轉為Java物件 1. 匯入jackson的相關jar包 2. 建立Jackson核心物件