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.mzph.cn/web/23917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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; 使用技术手段验证软件是否满足需求 主流技能 …

《数学学习与研究》杂志是什么级别?知网收录吗?评职认可吗?

《数学学习与研究》杂志是什么级别&#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;深度了解传统…

小白必学!场外期权的交易模式

场外期权的交易模式 随着金融市场的深化与创新&#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…

如何从小米手机传输文件到电脑? [5个简单的方法]

与苹果设备间的AirDrop或iTunes等工具相比&#xff0c;Android手机到PC的文件传输似乎不那么便捷。但小米用户有多种应用&#xff0c;如Mi PC Suite和ShareMe&#xff0c;可以高效地进行传输。本文将介绍5种将小米设备文件传输到PC的方法&#xff0c;包括使用和不使用USB线的情…

深度学习_02_卷积神经网络循环神经网络

卷积神经网络 1. 卷积神经网络 神经元存在局部感受区域----感受野 . 第一个卷积神经网络雏形----新认知机 缺点&#xff1a;没有反向传播算法更新权值&#xff0c;模型性能有限 第一个大规模商用卷积神经网络----Lenet-5 缺点&#xff1a;没有大量数据和高性能计算资源。 第一个…

图解 React diff 算法

Render 阶段会生成 Fiber Tree&#xff0c;所谓的 diff 实际上就是发生在这个阶段&#xff0c;这里的 diff 指的是 current FiberNode 和 JSX 对象之间进行对比&#xff0c;然后生成新的的 wip FiberNode。 除了 React 以外&#xff0c;其他使用到了虚拟 DOM 的前端框架也会有类…

Kafka之Producer原理

1. 生产者发送消息源码分析 public class SimpleProducer {public static void main(String[] args) {Properties prosnew Properties();pros.put("bootstrap.servers","192.168.8.144:9092,192.168.8.145:9092,192.168.8.146:9092"); // pros.pu…

26-LINUX--I/O复用-select

一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符&#xff0c;对提高程序的性能有很大帮助。以下情况适用于I/O复用技术&#xff1a; ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…

使用 Django 构建动态网页

文章目录 创建 Django 项目和应用程序创建 HTML 模板创建视图函数配置 URL 路由运行 Django 服务器使用 Django 模板语言 Django 是一个流行的 Python Web 框架&#xff0c;它能够帮助开发人员快速构建强大的 Web 应用程序。在 Django 中&#xff0c;HTML 是用于呈现网页内容的…

1. 计算机系统概述

1. 计算机系统概述 文章目录 1. 计算机系统概述1.1 计算机的发展硬件的发展软件的发展 1.2.1 计算机硬件的基本组成早期冯诺依曼的结构现代计算机的结构 1.2.2 各个硬件的工作原理主存储器运算器控制器计算机工作过程 1.2.3 计算机系统的多级层次结构1.3 计算机的性能指标存储器…