xstream運用,JAVA對象轉xml,xml轉JAVA對象

目錄

xstream

優點:

缺點:

XStream的應用場景

用到的依賴

代碼實現

xml標簽對應的實體類

????????Header

????????Package

????????Request

????????Response

????????TradeInfo

工具類

????????XmlUtils

執行結果


xstream

XStream是一個Java類庫,主要用于將對象序列化為XML(或JSON)或將XML(或JSON)反序列化為對象。XStream使用Java反射機制對要進行序列化的對象樹的結構進行探索,無需對對象進行修改。它可以序列化內部字段,包括私有(private)和最終(final)字段,并支持非公開類以及內部類。在缺省情況下,XStream不需要配置映射關系,對象和字段將映射為同名XML元素。

優點

  1. 易用性:XStream不需要額外的輔助類或映射文件,使得XML序列化不再繁瑣。
  2. 靈活性:支持多種數據類型轉換,包括用戶自定義的類型轉換器。
  3. 可讀性:輸出通常比其他工具更清晰和易于閱讀。

缺點

  1. 效率:相對于某些工具(如XMLEncoder),XStream在處理大型數據集時可能會較慢,因為它需要在每個對象實例上運行解析器。
  2. 內存使用:XStream使用流操作可能導致較高的內存使用,特別是在處理大型數據集時。

XStream的應用場景

XStream的常見用途包括對象傳輸、持久化、配置以及單元測試等。它在許多項目中,特別是在支付API對接時,被用于實現Java對象和XML文檔的互轉。

用到的依賴

<!--XML解析--><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.20</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>

代碼實現

<!--xml報文-->
<?xml version='1.0' encoding='UTF-8'?>
<Package><Header><RequestType>131</RequestType><SystemNo>001</SystemNo><SendTime>2024-06-05 09:53:38</SendTime><Status>100</Status><ErrorMessage /></Header><Sign>NgJzJyhoeXYd/TJvJitByhUR1UVMJ+FjuMl4WVBjP0CsOM6owyX9nCn1c/IL+OpVeSYkl4k60Du8nLa13wRB1oqFA8I2zel9+Xiq7lAL0otIcdww4F9i5uULk2wpq8ApXcghO5suL54FPOutc+2gWNUUmdP6fb2/L2RFKOlcBig=</Sign><Response><DepartmentCode>5</DepartmentCode><TransSourceCode>0</TransSourceCode><PayNo /><PayAmount>100</PayAmount><RealPayAmount>100</RealPayAmount><PaymentTime>2024-06-05 09:50:49</PaymentTime><DealTime>2024-06-05 09:50:49</DealTime><PayType>1</PayType><PlatformCode>35</PlatformCode><PlatformName /><OrderId>1000000001678451</OrderId><OrderStatus>2</OrderStatus><PageUrl>https://blog.csdn.net/weixin_59383491?type=blog</PageUrl><NotifyUrl>https://blog.csdn.net/weixin_59383491?type=blog</NotifyUrl><AutoErrMsg /><BusinessTypeDetail /><BusinessType /><TradeList><TradeIfo><ProductId /><ApplyPolicyNo /><PersonnelName /><PlanCode /><ProductName>一百減一是零</ProductName><BatchDetailNo>1010000202400000065</BatchDetailNo><ProductType>7</ProductType><BatchPolicyNo /><TradeDetailNo /><TradeAmt>100</TradeAmt><OriginCode /><OriginTradeNo /></TradeIfo></TradeList></Response>
</Package>

xml標簽對應的實體類

????????Header

package com.yun.greedy.modules.util.xstream;import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;@XStreamAlias("Header")
@Data
public class Header {@XStreamAlias("RequestType")private String requestType;@XStreamAlias("SystemNo")private String systemNo;@XStreamAlias("SendTime")private String sendTime;@XStreamAlias("Status")private String status;@XStreamAlias("ErrorMessage")private String errorMessage;
}

????????Package

package com.yun.greedy.modules.util.xstream;import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;@XStreamAlias("Package")
@Data
public class Package {@XStreamAlias("Header")private Header head;@XStreamAlias("Sign")private String sign;@XStreamAlias("Request")private Request request;@XStreamAlias("Response")private Response response;
}

????????Request

package com.yun.greedy.modules.util.xstream;import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;import java.util.List;@Data
@XStreamAlias("Request")
public class Request {@XStreamAlias("DepartmentCode")private String departmentCode;@XStreamAlias("TransSourceCode")private String transSourceCode;@XStreamAlias("PayType")private String payType;@XStreamAlias("PlatformCode")private String platformCode;@XStreamAlias("BankType")private String bankType;@XStreamAlias("PayAmount")private String payAmount;@XStreamAlias("PageUrl")private String pageUrl;@XStreamAlias("NotifyUrl")private String notifyUrl;@XStreamAlias("TradeNo")private String tradeNo;@XStreamAlias("TradeList")private List<TradeInfo> tradeList;
}

????????Response

package com.yun.greedy.modules.util.xstream;import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;import java.util.List;@Data
@XStreamAlias("Response")
public class Response {@XStreamAlias("DepartmentCode")private String departmentCode;@XStreamAlias("TransSourceCode")private String transSourceCode;@XStreamAlias("PayAmount")private String payAmount;@XStreamAlias("RealPayAmount")private String realPayAmount;@XStreamAlias("PaymentTime")private String paymentTime;@XStreamAlias("PayType")private String payType;@XStreamAlias("PlatformCode")private String platformCode;@XStreamAlias("PlatformName")private String platformName;@XStreamAlias("TradeNo")private String tradeNo;@XStreamAlias("OrderId")private String orderId;@XStreamAlias("OrderStatus")private String orderStatus;@XStreamAlias("PageUrl")private String pageUrl;@XStreamAlias("NotifyUrl")private String notifyUrl;@XStreamAlias("AutoErrMsg")private String autoErrMsg;@XStreamAlias("DealTime")private String dealTime;@XStreamAlias("PayNo")private String payNo;@XStreamAlias("BusinessTypeDetail")private String businessTypeDetail;@XStreamAlias("BusinessType")private String businessType;@XStreamAlias("TradeList")private List<TradeInfo> tradeList;
}

????????TradeInfo

package com.yun.greedy.modules.util.xstream;import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;@Data
@XStreamAlias("TradeIfo")
public class TradeInfo {@XStreamAlias("ProductId")private String productId;@XStreamAlias("ApplyPolicyNo")private String applyPolicyNo;@XStreamAlias("PlanCode")private String planCode;@XStreamAlias("BatchPolicyNo")private String batchPolicyNo;@XStreamAlias("BatchDetailNo")private String batchDetailNo;@XStreamAlias("TradeDetailNo")private String tradeDetailNo;@XStreamAlias("PersonnelName")private String personnelName;@XStreamAlias("CertificateNo")private String certificateNo;@XStreamAlias("MobileTelephone")private String mobileTelephone;@XStreamAlias("TradeAmt")private String tradeAmt;@XStreamAlias("ProductType")private String productType;@XStreamAlias("ProductName")private String productName;@XStreamAlias("ViewProductUrl")private String viewProductUrl;@XStreamAlias("TradeCount")private String tradeCount;@XStreamAlias("InsuranceBeginTime")private String insuranceBeginTime;@XStreamAlias("OriginCode")private String originCode;@XStreamAlias("OriginTradeNo")private String originTradeNo;
}

工具類

????????XmlUtils

package com.yun.greedy.modules.util;import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.Dom4JDriver;
import com.thoughtworks.xstream.security.AnyTypePermission;
import com.yun.greedy.modules.util.xstream.Package;
import com.yun.greedy.modules.util.xstream.*;
import org.dom4j.DocumentFactory;
import org.dom4j.io.OutputFormat;import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class XmlUtils {/** 將XML報文轉化為java對象*/public static Object makeObjectFromXml(String docStr, Class[] classList) {XStream xstream = new XStream(new Dom4JDriver());//由于對象默認開啟安全防護,盡量限制最低權限xstream.addPermission(AnyTypePermission.ANY);xstream.processAnnotations(classList);return xstream.fromXML(docStr);}/*** 將對象轉化為xml報文** @param object* @param b      是否顯示為空的節點* @return*/public static String objectToXml(Object object, boolean b) {if (b) {replaceNullValue(object);}OutputFormat outputFormat = new OutputFormat();outputFormat.setEncoding("UTF-8");outputFormat.setNewLineAfterDeclaration(false);//對象名稱是否顯示路徑
//    outputFormat.setIndent(" ");outputFormat.setNewlines(true);//XML節點換行XStream xstream = new XStream(new Dom4JDriver(new DocumentFactory(), outputFormat));xstream.autodetectAnnotations(true);return xstream.toXML(object);}/*** changeFiledValue(替換字符串為null值的情況)** @param obj* @return void*/private static void replaceNullValue(Object obj) {if (obj == null) {return;}Field[] fields = obj.getClass().getDeclaredFields();for (Field field : fields) {try {String type = field.getType().getName();field.setAccessible(true);Object value = field.get(obj);if ("java.lang.String".equals(type)) {String genericStr = field.toGenericString();if (!genericStr.contains("final")) {field.set(obj, (value == null ? "" : value));}} else if ("java.util.List".equals(type)) {List list = (List) value;if (list != null && list.size() > 0) {for (int i = 0; i < list.size(); i++) {Object subObj = list.get(i);replaceNullValue(subObj);}}} else {replaceNullValue(value);}} catch (IllegalArgumentException e) {e.printStackTrace();System.out.println("返回報文對象替換null值出錯:" + e.getMessage());} catch (IllegalAccessException e) {e.printStackTrace();System.out.println("返回報文對象替換null值出錯:" + e.getMessage());}}}public static void main(String[] args) {String strXML = "<?xml version='1.0' encoding='UTF-8'?>\n" +"<Package>\n" +"    <Header>\n" +"        <RequestType>131</RequestType>\n" +"        <SystemNo>001</SystemNo>\n" +"        <SendTime>2024-06-05 09:53:38</SendTime>\n" +"        <Status>100</Status>\n" +"        <ErrorMessage />\n" +"    </Header>\n" +"    <Sign>NgJzJyhoeXYd/TJvJitByhUR1UVMJ+FjuMl4WVBjP0CsOM6owyX9nCn1c/IL+OpVeSYkl4k60Du8nLa13wRB1oqFA8I2zel9+Xiq7lAL0otIcdww4F9i5uULk2wpq8ApXcghO5suL54FPOutc+2gWNUUmdP6fb2/L2RFKOlcBig=</Sign>\n" +"    <Response>\n" +"        <DepartmentCode>5</DepartmentCode>\n" +"        <TransSourceCode>0</TransSourceCode>\n" +"        <PayNo />\n" +"        <PayAmount>100</PayAmount>\n" +"        <RealPayAmount>100</RealPayAmount>\n" +"        <PaymentTime>2024-06-05 09:50:49</PaymentTime>\n" +"        <DealTime>2024-06-05 09:50:49</DealTime>\n" +"        <PayType>1</PayType>\n" +"        <PlatformCode>35</PlatformCode>\n" +"        <PlatformName />\n" +"        <OrderId>1000000001678451</OrderId>\n" +"        <OrderStatus>2</OrderStatus>\n" +"        <PageUrl>https://blog.csdn.net/weixin_59383491?type=blog</PageUrl>\n" +"        <NotifyUrl>https://blog.csdn.net/weixin_59383491?type=blog</NotifyUrl>\n" +"        <AutoErrMsg />\n" +"        <BusinessTypeDetail />\n" +"        <BusinessType />\n" +"        <TradeList>\n" +"            <TradeIfo>\n" +"                <ProductId />\n" +"                <ApplyPolicyNo />\n" +"                <PersonnelName />\n" +"                <PlanCode />\n" +"                <ProductName>一百減一是零</ProductName>\n" +"                <BatchDetailNo>1010000202400000065</BatchDetailNo>\n" +"                <ProductType>7</ProductType>\n" +"                <BatchPolicyNo />\n" +"                <TradeDetailNo />\n" +"                <TradeAmt>100</TradeAmt>\n" +"                <OriginCode />\n" +"                <OriginTradeNo />\n" +"            </TradeIfo>\n" +"        </TradeList>\n" +"    </Response>\n" +"</Package>";Class[] classes = {Package.class, Header.class, Response.class, TradeInfo.class};Package packageObj = (Package) XmlUtils.makeObjectFromXml(strXML, classes);String str = null != packageObj ?"XML解析成功!" + packageObj.toString() : "報文解析失敗!";System.out.println("========XML轉對象========");System.out.println(str);Request re = new Request();re.setDepartmentCode("123");re.setTransSourceCode("TS");re.setBankType("CS");re.setPageUrl("https://blog.csdn.net/weixin_59383491?type=blog");TradeInfo tradeInfo = new TradeInfo();tradeInfo.setPersonnelName("一百減一是零");tradeInfo.setViewProductUrl("https://blog.csdn.net/weixin_59383491?type=blog");TradeInfo tradeInfo2 = new TradeInfo();tradeInfo2.setPersonnelName("一百減一是零");tradeInfo2.setViewProductUrl("https://blog.csdn.net/weixin_59383491?type=blog");List<TradeInfo> tradeInfoList = new ArrayList<>();tradeInfoList.add(tradeInfo);tradeInfoList.add(tradeInfo2);re.setTradeList(tradeInfoList);System.out.println("========對象轉XML========");String s = XmlUtils.objectToXml(re, false);System.out.println(s);}
}

執行結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/23917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/23917.shtml
英文地址,請注明出處:http://en.pswp.cn/web/23917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OV通配符ssl證書是什么

通配符https證書的產品比較豐富&#xff0c;為了方便區分&#xff0c;可以按照驗證方式將通配符https證書分為DV基礎型通配符https證書和OV企業型通配符https證書兩種。其中OV通配符https證書申請條件高&#xff0c;審核也比較嚴格&#xff0c;相比于DV基礎型通配符https證書&a…

IPv4 和 IPv6 是什么意思?它們之間的區別都有哪些?

什么是 IPv4 和 IPv6 什么是 IPv4 和 IPv6 呢&#xff1f;下面我們就來了解一下。 IPv4 就是互聯網協議第 4 版&#xff0c;是目前廣泛使用的網絡協議版本。它由互聯網工程任務組&#xff08;IETF&#xff09;在 1981 年開發完成。IPv4 使用 32 位地址&#xff0c;允許大約 4…

推薦系統三十六式學習筆記:原理篇.近鄰推薦07|人以群分,你是什么人就看到什么世界

目錄 協同過濾基于用戶的協同過濾背后的思想原理實踐1、構造矩陣2、相似度計算3、推薦計算4、一些改進 應用場景&#xff1a;總結 談及推薦系統&#xff0c;不得不說大名鼎鼎的協同過濾。協同過濾的重點在于協同&#xff0c;所謂協同&#xff0c;也就是群體互幫互助&#xff0c…

初級軟件測試快速入門

文章目錄 初級軟件測試-測試用例、缺陷報告的認識與使用軟件測試簡介測試分類模型質量模型測試模型 用例編寫的八大要素用例設計方法缺陷 初級軟件測試-測試用例、缺陷報告的認識與使用 軟件測試簡介 什么是軟件測試&#xff1f; 使用技術手段驗證軟件是否滿足需求 主流技能 …

關于 Vue.js 中`transition`組件使用:頁面切換動畫和標簽移動動畫都是要用到的

一、引言 在 Vue.js 中&#xff0c;transition組件提供了一種簡單而強大的方式來實現頁面過渡效果。它可以讓元素在狀態改變時&#xff0c;如進入或離開視圖時&#xff0c;以平滑的動畫方式進行過渡。通過transition&#xff0c;我們可以為應用增添更加生動和吸引人的用戶體驗…

Linux文件編碼格式為unknown 8bit

file -i 1.txt顯示文件編碼為unknown 8bit, 說明這個文件的編碼格式因為一些不明原因無法識別了。 可以嘗試用其他編輯器打開&#xff0c;來看一下編輯器最終是用什么編碼格式打開的。 vim :set filecodingnotepad 直接打開文件&#xff0c;右下角會顯示文件編碼 假設文件編…

《數學學習與研究》雜志是什么級別?知網收錄嗎?評職認可嗎?

《數學學習與研究》雜志是什么級別&#xff1f;知網收錄嗎&#xff1f;評職認可嗎&#xff1f; 《數學學習與研究》是由東北師范大學主管&#xff0c;吉林省數學會與東北師范大學出版社聯合主辦的省級優秀數學類期刊雜志。該雜志為半月刊&#xff0c;國際標準刊號為 ISSN1007-…

圖解通用網絡IO底層原理、Socket、epoll、用戶態內核態······

LInux 操作系統中斷 什么是系統中斷 這個沒啥可說的&#xff0c;大家都知道&#xff1b; CPU 在執行任務途中接收到中斷請求&#xff0c;需要保存現場后去處理中斷請求&#xff01;保存現場稱為中斷處理程序&#xff01;處理中斷請求也就是喚醒對應的任務進程來持有CPU進行需要…

《大宅門》特別活動走進李良濟,開啟探尋中醫藥文化之旅!

《大宅門》話劇將于6月14-16日在蘇州灣大劇院上演&#xff0c;為了讓大家了解到中醫藥知識&#xff0c;6月2日&#xff0c;李良濟攜手蘇州灣大劇院舉辦《大宅門》特別活動“探尋中醫藥文化之旅”&#xff01; 6月2日下午&#xff0c;大家一起走進李良濟&#xff0c;深度了解傳統…

vite熱更新導致的問題及解決

一、封裝axios攔截器后,每次熱更新雖然請求了一次,但是response了多次: import axios from "axios"; axios.interceptors.request.use() axios.service.interceptors.response.use()導致此問題是因為觸發了多次攔截器,相當于是給axios添加了多個攔截器,所以多次…

怎么能通過chatgpt-on-wechat獲取全部的微信聊天信息

要通過 chatgpt-on-wechat 工具獲取全部的微信聊天信息&#xff0c;你可以按照以下步驟操作&#xff1a; 安裝并配置 itchat 庫&#xff1a; itchat 是一個開源的微信個人號接口&#xff0c;可以幫助你獲取微信群聊信息。 pip install itchat登錄微信&#xff1a; 使用 itchat …

小白必學!場外期權的交易模式

場外期權的交易模式 隨著金融市場的深化與創新&#xff0c;場外期權交易作為一種靈活多樣的金融衍生品交易方式&#xff0c;正逐漸成為投資者關注的焦點。場外期權&#xff0c;顧名思義&#xff0c;是在非交易所市場進行的期權交易&#xff0c;與交易所期權有著顯著的區別。那…

Promed Bioscience—高純度膠原蛋白

Promed Bioscience——高純度膠原蛋白供應商 專于研發&#xff0c;忠于質量&#xff0c;創新驅動 AXXORA 作為Enzo life sciences公司的子公司&#xff0c;是歐美最大的生命科學研究信息、服務、銷售電子一站式服務平臺之一&#xff0c;AXXORA精選歐洲四十多家優秀的生命科學研…

Mac 使用Docker安裝Elasticsearch、Kibana 、ik分詞器、head

安裝ElasticSearch 通過docker安裝es docker pull elasticsearch:7.8.1 在本地創建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 編輯yml文件內容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

JAVA-LeetCode 熱題-第24題:兩兩交換鏈表中的節點

思路&#xff1a; 定義三個指針&#xff0c;其中一個臨時指針&#xff0c;進行交換兩個節點的值&#xff0c;重新給臨時指針賦值&#xff0c;移動鏈表 class Solution {public ListNode swapPairs(ListNode head) {ListNode pre new ListNode(0,head);ListNode temp pre;wh…

docker部署fastdfs

我的鏡像包地址 鏈接&#xff1a;https://pan.baidu.com/s/1j5E5O1xdyQVfJhsOevXvYg?pwdhcav 提取碼&#xff1a;hcav docker load -i gofast.tar.gz拉取gofast docker pull sjqzhang/go-fastdfs啟動gofast docker run -d --name fastdfs -p 8080:8080 -v /opt/lijia/lijia…

antd vue a-select 搜索

數據結構 list: [{ name: "序號", id: 0, show: true },{ name: "出庫單編號", id: 1, show: false },{ name: "wbs元素", id: 2, show: true },{ name: "序號1", id: 3, show: true },{ name: "出庫單編號1", id: 4, show…

Java_Collection的其它相關知識

前置知識&#xff1a;可變參數 就是一種特殊形參&#xff0c;定義在方法&#xff0c;構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型…參數名稱&#xff1b; 可變參數的好處和特點 好處&#xff1a;常常用來接受數據。 特點&#xff1a;可以不傳數據給它&#xf…

如何從小米手機傳輸文件到電腦? [5個簡單的方法]

與蘋果設備間的AirDrop或iTunes等工具相比&#xff0c;Android手機到PC的文件傳輸似乎不那么便捷。但小米用戶有多種應用&#xff0c;如Mi PC Suite和ShareMe&#xff0c;可以高效地進行傳輸。本文將介紹5種將小米設備文件傳輸到PC的方法&#xff0c;包括使用和不使用USB線的情…