I have the following entity:
@XStreamAlias("entity")
public class MapTestEntity {
@XStreamAsAttribute
public Map myMap = new HashMap<>();
@XStreamAsAttribute
public String myText;
}
I use it with xstream like:
MapTestEntity e = new MapTestEntity();
e.myText = "Foo";
e.myMap.put("firstname", "homer");
e.myMap.put("lastname", "simpson");
XStream xstream = new XStream(new PureJavaReflectionProvider());
xstream.processAnnotations(MapTestEntity.class);
System.out.println(xstream.toXML(e));
and get the following xml:
lastname
simpson
firstname
homer
But I need to map the HashMap to attributes in xml like:
How can I do that with XStream? Can I use a custom converter or mapper or something like that? TIA!!
(Of course my code needs to be ensure that are no duplicates in xml attributes.)
解决方案
I wrote an own Converter:
public class MapToAttributesConverter implements Converter {
public MapToAttributesConverter() {
}
@Override
public boolean canConvert(Class type) {
return Map.class.isAssignableFrom(type);
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Map map = (Map) source;
for (Map.Entry entry : map.entrySet()) {
writer.addAttribute(entry.getKey(), entry.getValue().toString());
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Map map = new HashMap();
for (int i = 0; i < reader.getAttributeCount(); i++) {
String key = reader.getAttributeName(i);
String value = reader.getAttribute(key);
map.put(key, value);
}
return map;
}
}