`

[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));
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics