xstream运用,JAVA对象转xml,xml转JAVA对象

news2024/11/25 13:44:03

目录

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.coloradmin.cn/o/1805981.html

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

相关文章

【零基础一看就会】Python爬虫从入门到应用(下)

目录 一、urllib的学习 1.1 urllib介绍 1.2 urllib的基本方法介绍 urllib.Request &#xff08;1&#xff09;构造简单请求 &#xff08;2&#xff09;传入headers参数 &#xff08;3&#xff09;传入data参数 实现发送post请求&#xff08;示例&#xff09; response.…

dnf手游版游玩感悟

dnf手游于5月21号正式上线&#xff0c;作为一个dnf端游老玩家&#xff0c;并且偶尔上线ppk&#xff0c;自然下载了手游版&#xff0c;且玩了几天。 不得不说dnf手游的优化做到了极好的程度。 就玩法系统这块&#xff0c;因为dnf属于城镇地下城模式&#xff0c;相比…

C\C++内存管理(未完结)

文章目录 一.C\C内存分布二.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三.C内存管理方式3.1.new/delete操作内置类型3.2.new和delete操作自定义类型 四.operator new与operator delete函数&#xff08;重要点进行讲解&#xff09;4.1. operator new与oper…

Spring Security 应用详解

一、 集成SpringBoot 1.1 Spring Boot 介绍 Spring Boot 是一套 Spring 的快速开发框架&#xff0c;基于 Spring 4.0 设计&#xff0c;使用 Spring Boot 开发可以避免一些繁琐的工程 搭建和配置&#xff0c;同时它集成了大量的常用框架&#xff0c;快速导入依赖包&#xff0…

【SpringCloud学习笔记】Docker(中篇)

Docker 1. 自定义镜像 前面我们都是使用docker pull拉取仓库中现成的镜像&#xff0c;但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢&#xff1f;这个时候我们就需要自定义镜像了 **镜像&#xff1a;**本质上就是一堆文件的集合&#xff0c;包含了应用程…

Nettyの前置理论篇

本篇主要介绍NIO中的三大组件&#xff1a;Channel、Buffer、Selector的理论知识 1、NIO基本概念 NIO&#xff08;non-blocking io 或 new io&#xff09;区别于传统IO&#xff0c;是一种面向缓冲区的非阻塞IO操作&#xff0c;在传统IO中&#xff0c;数据是以字节或字符为单位从…

DevExpress Installed

一、What’s Installed 统一安装程序将DevExpress控件和库注册到Visual Studio中&#xff0c;并安装DevExpress实用工具、演示应用程序和IDE插件。 Visual Studio工具箱中的DevExpress控件 Visual Studio中的DevExpress菜单 Demo Applications 演示应用程序 Launch the Demo…

【栈】895. 最大频率栈

本文涉及知识点 栈 LeetCode895. 最大频率栈 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除并返…

每天壁纸不重样~下载必应每日图片

下载必应每日图片 必应不知道你用过没有你下载过必应的图片没有你又没搜索过桌面图片你是不是安装过桌面图片软件你是不是为找一个好看的图片下载过很多桌面软件 必应每日图片 必应每天都会有一张不同的风景图片&#xff0c;画质清晰&#xff0c;而且不收费可以下载使用 但…

解决Win10系统ping不通、无法远程的问题

1、概述 某天要使用微软的远程桌面程序mstsc.exe远程到旁边的一台测试电脑上,结果远程不了,ping都ping不通,于是详细研究了这个问题。在此大概地记录一下该问题排查的过程,以供参考。 2、ping不通 使用mstsc.exe远程到测试电脑,远程不了,没有反应。于是手动ping一…

IDEA创建Mybatis项目

IDEA创建Mybatis项目 第一步&#xff1a;创建库表 -- 创建数据库 create database mybatis_db;-- 使用数据库 use mybatis_db;-- 创建user表 CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL,email VARC…

【WP|9】深入解析WordPress [add_shortcode]函数

add_shortcode 是 WordPress 中一个非常强大的函数&#xff0c;用于创建自定义的短代码&#xff08;shortcodes&#xff09;。短代码是一种简洁的方式&#xff0c;允许用户在内容中插入动态的、可重用的功能。通过 add_shortcode&#xff0c;开发者可以定义自己的短代码&#x…

里卡提方程(Riccati Equation)例子

里卡提方程(Riccati Equation) 里卡提方程(Riccati Equation)在人形机器人控制中有重要的应用,特别是在最优控制和估计问题中。里卡提方程主要用于求解线性二次型调节器(LQR, Linear Quadratic Regulator)和卡尔曼滤波器(Kalman Filter)。这些方法有助于提高机器人控…

物联网开发tcp协议之——netty拆包问题

1.前言 tcp协议是物联网开发中比较常见的一种通信协议&#xff0c;而netty则是一tcp通信协议中一个比较优秀的框架。tcp协议是一种长连接的协议&#xff0c;是流式传输的&#xff0c;开发过程中最长遇见的问题就是拆包粘包问题。我目前对接过的物联网系列有智能家居设备&#…

8.2 Go 导入与导出

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

雷电模拟器中控实现,直通源码

目录 前言 开发 需求 初始环境 UI搭建 功能实现 前言 本篇为易语言雷电模拟器中控项目实现操作&#xff0c;一般用于&#xff1a;脚本开发多线程模拟操作等起始模板框架&#xff0c;使用易语言原因为其前后端一体化&#xff0c;对于脚本开发而言更为方便。 开发 需求 以…

Python爬虫入门与登录验证自动化思路

1、pytyon爬虫 1.1、爬虫简介 Python爬虫是使用Python编写的程序&#xff0c;可以自动访问网页并提取其中的信息。爬虫可以模拟浏览器的行为&#xff0c;自动点击链接、填写表单、进行登录等操作&#xff0c;从而获取网页中的数据。 使用Python编写爬虫的好处是&#xff0c;…

[数据集][目标检测]足球场足球运动员身份识别足球裁判员数据集VOC+YOLO格式312张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;312 标注数量(xml文件个数)&#xff1a;312 标注数量(txt文件个数)&#xff1a;312 标注类别…

LeetCode | 1624.两个相同字符之间的最长子字符串

这道题拿到手想法就是去双重遍历暴力解&#xff0c;对于每个字符&#xff0c;从后往前遍历字符串&#xff0c;找到从后往前一直到本次遍历的这个字符串这段子串中和这个字符串相同的字符位置&#xff0c;然后得到子字符串的长度&#xff0c;和ans存储的值做一个比较&#xff0c…