• 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文档的互转。

    用到的依赖

    1. <dependency>
    2. <groupId>com.thoughtworks.xstreamgroupId>
    3. <artifactId>xstreamartifactId>
    4. <version>1.4.20version>
    5. dependency>
    6. <dependency>
    7. <groupId>dom4jgroupId>
    8. <artifactId>dom4jartifactId>
    9. <version>1.6.1version>
    10. dependency>

    代码实现

    1. <Package>
    2. <Header>
    3. <RequestType>131RequestType>
    4. <SystemNo>001SystemNo>
    5. <SendTime>2024-06-05 09:53:38SendTime>
    6. <Status>100Status>
    7. <ErrorMessage />
    8. Header>
    9. <Sign>NgJzJyhoeXYd/TJvJitByhUR1UVMJ+FjuMl4WVBjP0CsOM6owyX9nCn1c/IL+OpVeSYkl4k60Du8nLa13wRB1oqFA8I2zel9+Xiq7lAL0otIcdww4F9i5uULk2wpq8ApXcghO5suL54FPOutc+2gWNUUmdP6fb2/L2RFKOlcBig=Sign>
    10. <Response>
    11. <DepartmentCode>5DepartmentCode>
    12. <TransSourceCode>0TransSourceCode>
    13. <PayNo />
    14. <PayAmount>100PayAmount>
    15. <RealPayAmount>100RealPayAmount>
    16. <PaymentTime>2024-06-05 09:50:49PaymentTime>
    17. <DealTime>2024-06-05 09:50:49DealTime>
    18. <PayType>1PayType>
    19. <PlatformCode>35PlatformCode>
    20. <PlatformName />
    21. <OrderId>1000000001678451OrderId>
    22. <OrderStatus>2OrderStatus>
    23. <PageUrl>https://blog.csdn.net/weixin_59383491?type=blogPageUrl>
    24. <NotifyUrl>https://blog.csdn.net/weixin_59383491?type=blogNotifyUrl>
    25. <AutoErrMsg />
    26. <BusinessTypeDetail />
    27. <BusinessType />
    28. <TradeList>
    29. <TradeIfo>
    30. <ProductId />
    31. <ApplyPolicyNo />
    32. <PersonnelName />
    33. <PlanCode />
    34. <ProductName>一百减一是零ProductName>
    35. <BatchDetailNo>1010000202400000065BatchDetailNo>
    36. <ProductType>7ProductType>
    37. <BatchPolicyNo />
    38. <TradeDetailNo />
    39. <TradeAmt>100TradeAmt>
    40. <OriginCode />
    41. <OriginTradeNo />
    42. TradeIfo>
    43. TradeList>
    44. Response>
    45. Package>

    xml标签对应的实体类

            Header

    1. package com.yun.greedy.modules.util.xstream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import lombok.Data;
    4. @XStreamAlias("Header")
    5. @Data
    6. public class Header {
    7. @XStreamAlias("RequestType")
    8. private String requestType;
    9. @XStreamAlias("SystemNo")
    10. private String systemNo;
    11. @XStreamAlias("SendTime")
    12. private String sendTime;
    13. @XStreamAlias("Status")
    14. private String status;
    15. @XStreamAlias("ErrorMessage")
    16. private String errorMessage;
    17. }

            Package

    1. package com.yun.greedy.modules.util.xstream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import lombok.Data;
    4. @XStreamAlias("Package")
    5. @Data
    6. public class Package {
    7. @XStreamAlias("Header")
    8. private Header head;
    9. @XStreamAlias("Sign")
    10. private String sign;
    11. @XStreamAlias("Request")
    12. private Request request;
    13. @XStreamAlias("Response")
    14. private Response response;
    15. }

            Request

    1. package com.yun.greedy.modules.util.xstream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import lombok.Data;
    4. import java.util.List;
    5. @Data
    6. @XStreamAlias("Request")
    7. public class Request {
    8. @XStreamAlias("DepartmentCode")
    9. private String departmentCode;
    10. @XStreamAlias("TransSourceCode")
    11. private String transSourceCode;
    12. @XStreamAlias("PayType")
    13. private String payType;
    14. @XStreamAlias("PlatformCode")
    15. private String platformCode;
    16. @XStreamAlias("BankType")
    17. private String bankType;
    18. @XStreamAlias("PayAmount")
    19. private String payAmount;
    20. @XStreamAlias("PageUrl")
    21. private String pageUrl;
    22. @XStreamAlias("NotifyUrl")
    23. private String notifyUrl;
    24. @XStreamAlias("TradeNo")
    25. private String tradeNo;
    26. @XStreamAlias("TradeList")
    27. private List tradeList;
    28. }

            Response

    1. package com.yun.greedy.modules.util.xstream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import lombok.Data;
    4. import java.util.List;
    5. @Data
    6. @XStreamAlias("Response")
    7. public class Response {
    8. @XStreamAlias("DepartmentCode")
    9. private String departmentCode;
    10. @XStreamAlias("TransSourceCode")
    11. private String transSourceCode;
    12. @XStreamAlias("PayAmount")
    13. private String payAmount;
    14. @XStreamAlias("RealPayAmount")
    15. private String realPayAmount;
    16. @XStreamAlias("PaymentTime")
    17. private String paymentTime;
    18. @XStreamAlias("PayType")
    19. private String payType;
    20. @XStreamAlias("PlatformCode")
    21. private String platformCode;
    22. @XStreamAlias("PlatformName")
    23. private String platformName;
    24. @XStreamAlias("TradeNo")
    25. private String tradeNo;
    26. @XStreamAlias("OrderId")
    27. private String orderId;
    28. @XStreamAlias("OrderStatus")
    29. private String orderStatus;
    30. @XStreamAlias("PageUrl")
    31. private String pageUrl;
    32. @XStreamAlias("NotifyUrl")
    33. private String notifyUrl;
    34. @XStreamAlias("AutoErrMsg")
    35. private String autoErrMsg;
    36. @XStreamAlias("DealTime")
    37. private String dealTime;
    38. @XStreamAlias("PayNo")
    39. private String payNo;
    40. @XStreamAlias("BusinessTypeDetail")
    41. private String businessTypeDetail;
    42. @XStreamAlias("BusinessType")
    43. private String businessType;
    44. @XStreamAlias("TradeList")
    45. private List tradeList;
    46. }

            TradeInfo

    1. package com.yun.greedy.modules.util.xstream;
    2. import com.thoughtworks.xstream.annotations.XStreamAlias;
    3. import lombok.Data;
    4. @Data
    5. @XStreamAlias("TradeIfo")
    6. public class TradeInfo {
    7. @XStreamAlias("ProductId")
    8. private String productId;
    9. @XStreamAlias("ApplyPolicyNo")
    10. private String applyPolicyNo;
    11. @XStreamAlias("PlanCode")
    12. private String planCode;
    13. @XStreamAlias("BatchPolicyNo")
    14. private String batchPolicyNo;
    15. @XStreamAlias("BatchDetailNo")
    16. private String batchDetailNo;
    17. @XStreamAlias("TradeDetailNo")
    18. private String tradeDetailNo;
    19. @XStreamAlias("PersonnelName")
    20. private String personnelName;
    21. @XStreamAlias("CertificateNo")
    22. private String certificateNo;
    23. @XStreamAlias("MobileTelephone")
    24. private String mobileTelephone;
    25. @XStreamAlias("TradeAmt")
    26. private String tradeAmt;
    27. @XStreamAlias("ProductType")
    28. private String productType;
    29. @XStreamAlias("ProductName")
    30. private String productName;
    31. @XStreamAlias("ViewProductUrl")
    32. private String viewProductUrl;
    33. @XStreamAlias("TradeCount")
    34. private String tradeCount;
    35. @XStreamAlias("InsuranceBeginTime")
    36. private String insuranceBeginTime;
    37. @XStreamAlias("OriginCode")
    38. private String originCode;
    39. @XStreamAlias("OriginTradeNo")
    40. private String originTradeNo;
    41. }

    工具类

            XmlUtils

    1. package com.yun.greedy.modules.util;
    2. import com.thoughtworks.xstream.XStream;
    3. import com.thoughtworks.xstream.io.xml.Dom4JDriver;
    4. import com.thoughtworks.xstream.security.AnyTypePermission;
    5. import com.yun.greedy.modules.util.xstream.Package;
    6. import com.yun.greedy.modules.util.xstream.*;
    7. import org.dom4j.DocumentFactory;
    8. import org.dom4j.io.OutputFormat;
    9. import java.lang.reflect.Field;
    10. import java.util.ArrayList;
    11. import java.util.List;
    12. public class XmlUtils {
    13. /*
    14. * 将XML报文转化为java对象
    15. */
    16. public static Object makeObjectFromXml(String docStr, Class[] classList) {
    17. XStream xstream = new XStream(new Dom4JDriver());
    18. //由于对象默认开启安全防护,尽量限制最低权限
    19. xstream.addPermission(AnyTypePermission.ANY);
    20. xstream.processAnnotations(classList);
    21. return xstream.fromXML(docStr);
    22. }
    23. /**
    24. * 将对象转化为xml报文
    25. *
    26. * @param object
    27. * @param b 是否显示为空的节点
    28. * @return
    29. */
    30. public static String objectToXml(Object object, boolean b) {
    31. if (b) {
    32. replaceNullValue(object);
    33. }
    34. OutputFormat outputFormat = new OutputFormat();
    35. outputFormat.setEncoding("UTF-8");
    36. outputFormat.setNewLineAfterDeclaration(false);//对象名称是否显示路径
    37. // outputFormat.setIndent(" ");
    38. outputFormat.setNewlines(true);//XML节点换行
    39. XStream xstream = new XStream(new Dom4JDriver(new DocumentFactory(), outputFormat));
    40. xstream.autodetectAnnotations(true);
    41. return xstream.toXML(object);
    42. }
    43. /**
    44. * changeFiledValue(替换字符串为null值的情况)
    45. *
    46. * @param obj
    47. * @return void
    48. */
    49. private static void replaceNullValue(Object obj) {
    50. if (obj == null) {
    51. return;
    52. }
    53. Field[] fields = obj.getClass().getDeclaredFields();
    54. for (Field field : fields) {
    55. try {
    56. String type = field.getType().getName();
    57. field.setAccessible(true);
    58. Object value = field.get(obj);
    59. if ("java.lang.String".equals(type)) {
    60. String genericStr = field.toGenericString();
    61. if (!genericStr.contains("final")) {
    62. field.set(obj, (value == null ? "" : value));
    63. }
    64. } else if ("java.util.List".equals(type)) {
    65. List list = (List) value;
    66. if (list != null && list.size() > 0) {
    67. for (int i = 0; i < list.size(); i++) {
    68. Object subObj = list.get(i);
    69. replaceNullValue(subObj);
    70. }
    71. }
    72. } else {
    73. replaceNullValue(value);
    74. }
    75. } catch (IllegalArgumentException e) {
    76. e.printStackTrace();
    77. System.out.println("返回报文对象替换null值出错:" + e.getMessage());
    78. } catch (IllegalAccessException e) {
    79. e.printStackTrace();
    80. System.out.println("返回报文对象替换null值出错:" + e.getMessage());
    81. }
    82. }
    83. }
    84. public static void main(String[] args) {
    85. String strXML = "\n" +
    86. "\n" +
    87. "
      \n" +
    88. " 131\n" +
    89. " 001\n" +
    90. " 2024-06-05 09:53:38\n" +
    91. " 100\n" +
    92. " \n" +
    93. " \n" +
    94. " NgJzJyhoeXYd/TJvJitByhUR1UVMJ+FjuMl4WVBjP0CsOM6owyX9nCn1c/IL+OpVeSYkl4k60Du8nLa13wRB1oqFA8I2zel9+Xiq7lAL0otIcdww4F9i5uULk2wpq8ApXcghO5suL54FPOutc+2gWNUUmdP6fb2/L2RFKOlcBig=\n" +
    95. " \n" +
    96. " 5\n" +
    97. " 0\n" +
    98. " \n" +
    99. " 100\n" +
    100. " 100\n" +
    101. " 2024-06-05 09:50:49\n" +
    102. " 2024-06-05 09:50:49\n" +
    103. " 1\n" +
    104. " 35\n" +
    105. " \n" +
    106. " 1000000001678451\n" +
    107. " 2\n" +
    108. " https://blog.csdn.net/weixin_59383491?type=blog\n" +
    109. " https://blog.csdn.net/weixin_59383491?type=blog\n" +
    110. " \n" +
    111. " \n" +
    112. " \n" +
    113. " \n" +
    114. " \n" +
    115. " \n" +
    116. " \n" +
    117. " \n" +
    118. " \n" +
    119. " 一百减一是零\n" +
    120. " 1010000202400000065\n" +
    121. " 7\n" +
    122. " \n" +
    123. " \n" +
    124. " 100\n" +
    125. " \n" +
    126. " \n" +
    127. " \n" +
    128. " \n" +
    129. " \n" +
    130. "";
    131. Class[] classes = {Package.class, Header.class, Response.class, TradeInfo.class};
    132. Package packageObj = (Package) XmlUtils.makeObjectFromXml(strXML, classes);
    133. String str = null != packageObj ?
    134. "XML解析成功!" + packageObj.toString() : "报文解析失败!";
    135. System.out.println("========XML转对象========");
    136. System.out.println(str);
    137. Request re = new Request();
    138. re.setDepartmentCode("123");
    139. re.setTransSourceCode("TS");
    140. re.setBankType("CS");
    141. re.setPageUrl("https://blog.csdn.net/weixin_59383491?type=blog");
    142. TradeInfo tradeInfo = new TradeInfo();
    143. tradeInfo.setPersonnelName("一百减一是零");
    144. tradeInfo.setViewProductUrl("https://blog.csdn.net/weixin_59383491?type=blog");
    145. TradeInfo tradeInfo2 = new TradeInfo();
    146. tradeInfo2.setPersonnelName("一百减一是零");
    147. tradeInfo2.setViewProductUrl("https://blog.csdn.net/weixin_59383491?type=blog");
    148. List tradeInfoList = new ArrayList<>();
    149. tradeInfoList.add(tradeInfo);
    150. tradeInfoList.add(tradeInfo2);
    151. re.setTradeList(tradeInfoList);
    152. System.out.println("========对象转XML========");
    153. String s = XmlUtils.objectToXml(re, false);
    154. System.out.println(s);
    155. }
    156. }

    执行结果

  • 相关阅读:
    信息化发展73
    vue中组件模板为什么只有一个根元素?
    这可能是最全的Web测试各个测试点,有这一篇就够了
    redis 集群 哨兵
    中文版FL Studio 20 for Mac破解版水果编曲软件 V20.8.3(1574)支持M1/M2+Intel
    《自然语言处理》第一次实验:TextCNN情感分类
    Snipaste安装及使用方法
    Suc-Ala-Ala-Pro-Asp-pNA,CAS号: 165174-58-3
    CSS:背景、阴影
    linux上安装apktool反编译apk解析AndroidManifest.xml得到首页Activity
  • 原文地址:https://blog.csdn.net/weixin_59383491/article/details/139502526