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


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

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

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

    直接上代码 PojoMapConverter.java

    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

    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));
  • 相关阅读:
    JS的toFixed方法设置小数点位数后再进行计算,数据出错问题
    表单input项使用label,同时引用Bootstrap库,导致input点击效果区增大
    表单多文件上传样式美化 && 支持选中文件后删除相关项
    Fiddler使用AutoResponder进行本地文件和线上文件的映射
    ES6笔记(7)-- Promise异步编程
    ES6笔记(6)-- Set、Map结构和Iterator迭代器
    ES6笔记(5)-- Generator生成器函数
    ES6笔记(4)-- Symbol类型
    ES6笔记(3)-- 解构赋值
    ES6笔记(2)-- let的块级作用域
  • 原文地址:https://www.cnblogs.com/snippet/p/PojoMapConverter.html
Copyright © 2020-2023  润新知