`

[Java]一则自定义的XStream转换器,主要用于POJO XML反序列化为Map/List

 
阅读更多

使用轻量级的XStream可以很方便的将对象序列化为XML

 

此外,XStream还可自定义序列化和反序列的转换器(Converter)

 

下面的转换器可将Map/List序列化,或将其他POJO的序列化XML反转为Map/List

 

直接上代码 PojoMapConverter.java

 

复制代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->package net.cnlab.vo.services.xstream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; public class PojoMapConverter implements Converter { public PojoMapConverter() { super(); } public boolean canConvert(Class clazz) { String classname = clazz.getName(); if (classname.indexOf("Map") >= 0 || classname.indexOf("List") >= 0 || classname.indexOf("Bean") >= 0) return true; else return false; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { map2xml(value, writer, context); } protected void map2xml(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { boolean bMap = true; String classname = value.getClass().getName(); bMap = (classname.indexOf("List") < 0); Map<String, Object> map; List<Object> list; String key; Object subvalue; if (bMap) { map = (Map<String, Object>) value; for (Iterator<Entry<String, Object>> iterator = map.entrySet() .iterator(); iterator.hasNext();) { Entry<String, Object> entry = (Entry<String, Object>) iterator .next(); key = (String) entry.getKey(); subvalue = entry.getValue(); writer.startNode(key); if (subvalue.getClass().getName().indexOf("String") >= 0) { writer.setValue((String) subvalue); } else { map2xml(subvalue, writer, context); } writer.endNode(); } } else { list = (List<Object>) value; for (Object subval : list) { subvalue = subval; writer.startNode("child"); if (subvalue.getClass().getName().indexOf("String") >= 0) { writer.setValue((String) subvalue); } else { map2xml(subvalue, writer, context); } writer.endNode(); } } } public Map<String, Object> unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Map<String, Object> map = (Map<String, Object>) populateMap(reader, context); return map; } protected Object populateMap(HierarchicalStreamReader reader, UnmarshallingContext context) { boolean bMap = true; Map<String, Object> map = new HashMap<String, Object>(); List<Object> list = new ArrayList<Object>(); while (reader.hasMoreChildren()) { reader.moveDown(); String key = reader.getNodeName(); Object value = null; if (reader.hasMoreChildren()) { value = populateMap(reader, context); } else { value = reader.getValue(); } if (bMap) { if (map.containsKey(key)) { // convert to list bMap = false; Iterator<Entry<String, Object>> iter = map.entrySet() .iterator(); while (iter.hasNext()) list.add(iter.next().getValue()); // insert into list list.add(value); } else { // insert into map map.put(key, value); } } else { // insert into list list.add(value); } reader.moveUp(); } if (bMap) return map; else return list; } }
复制代码

 

 通过XStream中注册该转换器,即可用toXML和fromXML转换

使用示例,将xml转为Map/List,然后再转换为xml

 

 

复制代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> public static void main(String[] args) { String xml = "<map><stars><star><id>1</id><name>littleflower</name></star><star><id>2</id><name>littleyellow</name></star></stars> <filename>cnlab</filename> <ra>147.0</ra> <dec>0.0</dec> <plate>0.0</plate> <mdj>0.0</mdj> </map> "; XStream xstream = new XStream(new DomDriver()); xstream.registerConverter(new PojoMapConverter()); Map<String, Object> map = (Map<String, Object>)xstream.fromXML(xml); System.out.println(map); xml = xstream.toXML(map); System.out.println(xml); System.out.println((Map<String, Object>)xstream.fromXML(xml));
分享到:
评论

相关推荐

    使用 XStream 把 Java 对象序列化为 XML

    XStream是一个强大的Java库,它允许开发者轻松地将Java对象序列化为XML,反之亦然。这个库特别有用,因为它提供了直观且易于使用的API,使得XML数据绑定变得简单。 **XStream 库简介** XStream由Johannes Link创建...

    使用XStream是实现XML与Java对象的转换(4)--转换器

    在Java开发中,数据序列化和反序列化是一项常见的任务,它允许我们将对象的状态转换为持久化的格式(如XML或JSON),以便存储或传输。XStream是一个强大的库,专门用于XML与Java对象之间的互相转换。这篇博文将深入...

    使用XStream序列化/反序列化对象

    XStream是一个强大的库,它允许开发者以XML格式进行序列化和反序列化Java对象。在这个场景中,我们将深入探讨如何使用XStream处理对象的序列化和反序列化。 首先,让我们了解什么是XStream。XStream是由Joe Walnes...

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    首先,XStream是一个强大的库,它由Pete Gyford开发,用于将Java对象序列化为XML,同时也能将XML反序列化为Java对象。它的主要优点是代码简洁,易于理解,同时也支持自定义转换规则,使得XML的结构可以更贴近业务...

    xStream转换xml和json源码

    xStream是一个轻量级的Java库,用于将Java对象序列化为XML,同时也能将XML反序列化回Java对象。这个强大的工具同样支持JSON格式,使得在Java应用程序中处理XML和JSON数据变得非常便捷。本篇文章将深入探讨xStream...

    Java用xStream拼接xml

    Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream是一个开源的Java库,由Johannes Link创建。它提供了简洁、直观的API来处理XML...

    Xstream register 转换器

    在IT行业中,XStream是一个非常流行的Java库,用于将对象序列化为XML和从XML反序列化回对象。"Xstream register 转换器"这个主题主要涉及到如何自定义转换器来处理特定类型的对象,以便更好地控制XML的输出格式或者...

    使用xstream解析xml,xml与pojo的双向转化,完整的java 工程

    XStream是JVM平台上的一个开源库,由XStream Software公司开发,它通过简单的API将Java对象序列化为XML,同时也能将XML反序列化回Java对象。这个过程非常便捷,使得开发者可以快速地处理XML数据,而无需手动编写大量...

    Xstream_java对象和xml的互相转换

    XStream 是一个强大的 Java 库,它允许程序员轻松地将 Java 对象序列化为 XML,同时也能从 XML 数据中反序列化回原来的 Java 对象。这个功能在数据持久化、网络传输或者配置文件存储等方面非常有用。XStream 的设计...

    XStream解析XML实例

    在Java开发中,处理XML数据是一项常见的任务,XStream库提供了一个简单而强大的方式来将Java对象序列化为XML,以及从XML反序列化回Java对象。这个实例将深入探讨如何使用XStream进行XML操作。 **1. XStream简介** ...

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...

    XStream在Java对象和XML之间相互转换

    XStream是一款强大的Java库,主要用于将Java对象序列化为XML,并能从XML反序列化回Java对象。这个功能对于数据存储、网络传输或者XML配置文件的解析非常有用。标题和描述提到的三个JAR文件——xstream-1.3.jar、kxml...

    java 利用Xstream注解生成和解析xml

    Java中的Xstream库是一个强大的工具,它允许程序员方便地将Java对象序列化为XML和从XML反序列化回Java对象。这个过程对于数据交换、持久化或者创建XML配置文件非常有用。Xstream通过使用注解提供了高度的灵活性,...

    xstream轻松解析xml到java对象

    XStream是一个Java库,它能将Java对象序列化为XML,同时也能将XML反序列化为Java对象,极大地简化了XML处理过程。 XStream的工作原理是基于反射和类型转换,它可以自动地映射Java类的字段到XML元素,反之亦然。这...

    xstream对象与xml转换

    在Java编程语言中,XStream库提供了一个简单且强大的机制,用于将Java对象序列化为XML,反之亦然。这使得在存储数据、传输数据或持久化对象时非常方便。本教程将深入探讨XStream库及其在Java中的使用,通过实际的...

    xStream 实现xml与 java对象的转换

    8. **处理集合和数组**:xStream会自动处理List、Set等集合类型的序列化和反序列化,只需确保Java对象中的集合类型已正确映射到XML元素。 9. **安全注意事项**:xStream默认信任所有输入,这可能会导致潜在的安全...

    好用的xStream XML和JAVA对象互相转换的简单示例

    XStream是一个轻量级、高性能的库,能够将Java对象序列化为XML,同时也能将XML反序列化回Java对象,实现XML和Java对象的互相转换。 首先,我们需要引入XStream库。在给定的描述中提到了两个依赖文件:xstream-1.3.1...

    xml解析及使用XStream实现javaBean与xml之间的转换

    XStream是Java中一个强大的库,用于将Java对象序列化为XML,反之亦然。它提供了简单直观的API,使得JavaBean与XML之间的转换变得非常容易。 3. **XStream的使用步骤** - 引入依赖:在项目中引入XStream的jar包或...

    XStream测试Demo-xml与java对象的相互转换

    XStream是一款强大的Java库,它允许开发者方便地将XML数据序列化为Java对象,以及将Java对象反序列化为XML。这个"XStream测试Demo-xml与java对象的相互转换"是一个实例,展示了如何利用XStream进行这两种操作。在...

    xStream完美转换XML.docx

    xStream是一个强大的Java库,它提供了简单易用的API,用于将Java对象序列化为XML,以及将XML反序列化回Java对象。此外,xStream还支持JSON格式的转换。这个框架在处理复杂的对象模型时尤其有用,因为它能够自动映射...

Global site tag (gtag.js) - Google Analytics