XStream将JavaBean转为xml

╰半橙微兮° 2023-07-10 14:10 40阅读 0赞

在项目中突然要想使用xml ,又涉及到java对象转为xml ,于是就学习了XStream,并封装了Xml工具类,于是就编写本博客作为记录。

具体使用可以看这篇文章: XStream 简介

不多说,直接上代码 ,如下所示:

javabean代码如下:

  1. @XStreamAlias("bank")
  2. public class Bank {
  3. private String name;
  4. private String address;
  5. private Map<String, String> map;
  6. private List<Account> accounts;
  7. //省略 setter 和getter
  8. }

封装工具类如下:

  1. import com.thoughtworks.xstream.XStream;
  2. import com.thoughtworks.xstream.converters.Converter;
  3. import com.thoughtworks.xstream.converters.MarshallingContext;
  4. import com.thoughtworks.xstream.converters.UnmarshallingContext;
  5. import com.thoughtworks.xstream.io.HierarchicalStreamReader;
  6. import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
  7. import com.thoughtworks.xstream.io.xml.DomDriver;
  8. import java.util.AbstractMap;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. public class XmlUtils {
  12. public static Boolean useConverter = true; // 是否使用map转换器。
  13. private static Converter converter = new MapEntryConverter(); //转换器
  14. public static Converter getConverter() {
  15. return converter;
  16. }
  17. private static <T> XStream getXStream(Class<T> t) {
  18. //创建解析XML对象
  19. XStream xStream = new XStream(new DomDriver());
  20. //处理注解
  21. xStream.processAnnotations(t);
  22. if (useConverter)
  23. xStream.registerConverter(converter);
  24. return xStream;
  25. }
  26. /**
  27. * XML转对象
  28. *
  29. * @param clazz 对象类
  30. * @param xml xml字符串
  31. * @param <T> T
  32. * @return
  33. */
  34. public static <T> T parseFromXml(Class<T> clazz, String xml) {
  35. XStream xStream = getXStream(clazz);
  36. @SuppressWarnings("unchecked")
  37. T t = (T) xStream.fromXML(xml);//将XML字符串转为bean对象
  38. return t;
  39. }
  40. /**
  41. * 对象转xml
  42. *
  43. * @param obj 对象
  44. * @return
  45. */
  46. public static String toXml(Object obj) {
  47. XStream xStream = getXStream(obj.getClass());
  48. return xStream.toXML(obj);
  49. }
  50. private static class MapEntryConverter implements Converter {
  51. public boolean canConvert(Class clazz) {
  52. return AbstractMap.class.isAssignableFrom(clazz);
  53. }
  54. public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
  55. AbstractMap map = (AbstractMap) value;
  56. for (Object obj : map.entrySet()) {
  57. Map.Entry entry = (Map.Entry) obj;
  58. writer.startNode(entry.getKey().toString());
  59. writer.setValue(entry.getValue().toString());
  60. writer.endNode();
  61. }
  62. }
  63. public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
  64. Map<String, String> map = new HashMap<String, String>();
  65. while (reader.hasMoreChildren()) {
  66. reader.moveDown();
  67. map.put(reader.getNodeName(), reader.getValue());
  68. reader.moveUp();
  69. }
  70. return map;
  71. }
  72. }
  73. }

考虑到项目中的javaBean中也可能存在map集合,于是我在工具类上又自定义了一个转换器,用于对map集合进行处理。

测试代码如下:

  1. private static void test2() {
  2. // XmlUtils.useConverter = true;
  3. Bank bank = getBank();
  4. String result = XmlUtils.toXml(bank);
  5. System.out.println(result);
  6. System.out.println("-------------------转换结束-------");
  7. Bank newBank = XmlUtils.parseFromXml(Bank.class, result);
  8. System.out.println(newBank);
  9. }
  10. private static Bank getBank() {
  11. Bank bank = new Bank();
  12. Account account1 = new Account();
  13. Account account2 = new Account();
  14. account1.setAccoutId(1);
  15. account1.setAccountName("aaa");
  16. account1.setAccountMoeny(100);
  17. account1.setTelNum("1333333333");
  18. account2.setAccoutId(2);
  19. account2.setAccountName("sunli");
  20. account2.setAccountMoeny(200);
  21. account2.setTelNum("14444444");
  22. List<Account> accounts = new ArrayList<Account>();
  23. accounts.add(account1);
  24. accounts.add(account2);
  25. Map<String, String> map = new HashMap<>();
  26. map.put("test", "111");
  27. map.put("test2", "1001");
  28. map.put("test3", "000");
  29. bank.setMap(map);
  30. bank.setName("中国人民银行");
  31. bank.setAddress("地球");
  32. bank.setAccounts(accounts);
  33. return bank;
  34. }

控制台输出如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NTY0NDA0_size_16_color_FFFFFF_t_70

请注意看, 打印出的xml 中的map节点,如果使用XStream默认的转换器打印出来的map下的节点数据并不是这样。

发表评论

表情:
评论列表 (有 0 条评论,40人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java Excel转为XML

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性。通常,我们可以通过格式转换的方式来得到XML格式的文件。本文,将通过Java代码

    相关 C# HTML转为XML

    本文以C\及VB.NET后端程序代码示例展示如何将HTML转为XML文件。转换时,调用Word API -Free Spire.Doc for .NET 提供的文档加载方法及文

    相关 Java XML转为PDF

    可扩展标记语言(XML)文件是一种标准的文本文件,它使用特定的标记来描述文档的结构以及其他特性。通过将XML转换为PDF,能够便于文件传输及共享。本文,将介绍通过Java代码来