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);

    }
}

执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/684496.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Cochrane Library循证医学数据库的介绍及文献下载

今天要讲的数据库是Cochrane Library循证医学数据库&#xff0c;我们先来了解一下该数据库&#xff1a; Cochrane Library是国际Cochrane Collaboration的主要产品&#xff0c;由英国Wiley InterScience公司出版发行。是一个提供高质量证据的数据库&#xff0c;是循证医学的证…

如何在centos中关闭swap分区

目录 前言 为什么要关闭 Swap 分区&#xff1f; 如何在 CentOS 中临时关闭 Swap 分区&#xff1f; 如何在 CentOS 中永久关闭 Swap 分区&#xff1f; 验证swap是否被关闭 潜在的风险和注意事项 总结 前言 Swap 分区是 Linux 系统中用于扩展物理内存的一种机制。在物理内存…

vs code 导出插件 导入到新电脑上

1. 在 现在的电脑上 导出插件 在vscode 上执行 code --list-extensions > extensions.txt 然后项目的目录就有了一个文件 2. 将他复制到新电脑上&#xff0c;把文件放在项目的最外层&#xff08;跟上面的目录一样&#xff09; 执行命令 Get-Content extensions.txt | ForE…

华硕NUC 14 Pro+ :科技与艺术相得益彰

什么样的迷你主机可以称之为“艺术品”&#xff1f;让我们一起认识NUC 14 Pro&#xff0c;看科技与艺术可以交汇出怎样的独特韵味&#xff1f; 科技与美学的邂逅 华硕NUC 14 Pro不仅是一台性能强劲的电脑主机&#xff0c;更像是一件可以在桌面“展出”的艺术品。精致小巧的体积…

【C++进阶】深入STL之vector:深入研究迭代器失效及拷贝问题

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;初步了解vector &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之vector &#x1f4d2;1. 迭…

聚焦热点-“十五五”规划 国家发改委前期研究课题汇总

聚焦热点-“十五五”规划 国家发改委前期研究课题汇总 随着“十五五”规划的脚步日益临近&#xff0c;国家发改委及地方相关机构已启动了前期研究工作&#xff0c;以确保地方规划能够准确把握时代脉搏&#xff0c;推动经济社会的高质量发展。 2023年12月17日至18日&#xff0…

10.爬虫---XPath插件安装并解析爬取数据

10.XPath插件安装并解析爬取数据 1.XPath简介2.XPath helper安装3.XPath 常用规则4.实例引入4.1 //匹配所有节点4.2 / 或 // 匹配子节点或子孙节点4.3 ..或 parent::匹配父节点4.4 匹配属性4.5 text()文本获取4.6 属性获取4.7 属性多值匹配 1.XPath简介 XPath是一门在XML文档中…

【WP】猿人学13_入门级cookie

https://match.yuanrenxue.cn/match/13 抓包分析 抓包分析发现加密参数是cookie中有一个yuanrenxue_cookie 当cookie过期的时候&#xff0c;就会重新给match/13发包&#xff0c;这个包返回一段js代码&#xff0c;应该是生成cookie的 <script>document.cookie(y)(u)(a…

RocketMQ可视化界面安装

RocketMQ可视化界面安装 **起因&#xff1a;**访问rocketmq-externals项目的git地址&#xff0c;下载了源码&#xff0c;在目录中并没有找到rocketmq-console文件夹。 git下面文档提示rocketMQ的仪表板转移到了新的项目中&#xff0c;点击仪表板到新项目地址&#xff1b; 下载…

flutter封装日历选择器(单日选择)

简单封装&#xff1a; 引入库&#xff1a;table_calendar import package:generated/l10n.dart; import package:jade/utils/JadeColors.dart; import package:jade/utils/Utils.dart; import package:util/easy_loading_util.dart; import package:flutter/material.dart; im…

【Python报错】已解决ModuleNotFoundError: No module named ‘gensim’

成功解决“ModuleNotFoundError: No module named ‘gensim’”错误的全面指南 在Python编程中&#xff0c;尤其是进行文本挖掘和自然语言处理&#xff08;NLP&#xff09;时&#xff0c;gensim库是一个常用的工具&#xff0c;用于主题建模、文档相似度计算、词向量表示&#x…

泽众云真机-上线海外机型测试专栏

泽众云真机平台&#xff0c;2024上半年70机型升级&#xff0c;也包括热门的海外机型。 但是&#xff0c;运营客服反馈&#xff0c;用户找不到平台海外机型在哪里&#xff0c;我们发现海外机型排列位置有问题&#xff0c;用户不易发现。目前问题已解决&#xff0c;上线海外机型测…

应对800G以太网挑战:数据中心迁移

在过去几年中&#xff0c;云基础设施和服务的大规模使用推动了对更多带宽、更快速度和更低延迟性能的需求。交换机和服务器技术的改进要求布线和架构随之调整。因此&#xff0c;800G以太网对数据中心迁移的需求&#xff0c;特别是对速率&#xff08;包括带宽、光纤密度和通道速…

MySQL学习——选项文件的使用

MySQL 的许多程序都可以从选项文件&#xff08;有时也被称为配置文件&#xff09;中读取启动选项。选项文件提供了一种方便的方式来指定常用的选项&#xff0c;这样你就不必每次运行程序时都在命令行上输入这些选项。 要确定一个程序是否读取选项文件&#xff0c;你可以使用 -…

搭建高可用k8s

高可用只针对于api-server&#xff0c;需要用到nginx keepalived&#xff0c;nginx提供4层负载&#xff0c;keepalived提供vip(虚拟IP) 系统采用openEuler 22.03 LTS 1. 前期准备 因为机器内存只有16G&#xff0c;所有我采用3master 1node 1.1 修改主机配置&#xff08;所有节…

单投币的充电桩如何加装一个扫码模块

充电桩需要投币才能充电&#xff0c;可是现在的人们很少有带硬币的习惯&#xff0c;扫码成为了一个常规的手段。我们也会发现有的充电桩无法扫码&#xff0c;或者说扫码无效&#xff0c;那是因为充电桩没有安装扫码模块&#xff0c;那么充电桩该如何加装扫码模块。 首先将充电桩…

Podman和Docker的区别

Podman 和 Docker 都是用于容器化的工具&#xff0c;但它们在架构、安全性、容器编排以及一些设计理念上有显著的区别&#xff1a; 架构设计: Docker 使用客户端-服务器&#xff08;C/S&#xff09;架构&#xff0c;包含一个名为 dockerd 的守护进程&#xff0c;该进程以 root …

西门子学习笔记6 - TCP通讯

1、主站设置 1、添加两个PLC在网络组态进行链接在一起&#xff0c;使用tcp链接 2、设置主站IP地址为&#xff1a;192.168.1.1 3、添加TSEND_C功能块 4、设置功能块参数连接 5、设置如下所示&#xff08;连接参数设置&#xff09; 6、设置如下所示&#xff08;连接块参数设置&a…

【Text2SQL】评估 LLM 的 Text2SQL 能力

论文&#xff1a;Evaluating the Text-to-SQL Capabilities of Large Language Models ⭐⭐⭐⭐ arXiv:2204.00498 一、论文速读 本论文尝试了多种 prompt 结构&#xff0c;并且评估了他们在 Codex 和 GPT-3 上的表现。下面介绍这些 prompt 结构&#xff1a; 二、不同的 prom…

UI 自动化中的分层设计

以前的设计 在过去 UI 自动化测试领域有一个规范的设计模式是 page object 模式。 意思是测试用例不会直接定位页面元素&#xff0c; 而是把每一个页面封装成一个类。 在这个类中封装页面元素。 然后测试用例调用 page 类来操作页面元素完成测试用例。如下图&#xff1a; 以前…