package br.com.caelum.example.vraptor.component; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletResponse; import br.com.caelum.vraptor.interceptor.DefaultTypeNameExtractor; import br.com.caelum.vraptor.interceptor.TypeNameExtractor; import br.com.caelum.vraptor.ioc.Component; import br.com.caelum.vraptor.serialization.ProxyInitializer; import br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.collections.CollectionConverter; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.mapper.Mapper; @Component public class JSONSerializationCustomized extends XStreamJSONSerialization { public JSONSerializationCustomized(HttpServletResponse response, TypeNameExtractor extractor, ProxyInitializer initializer) { super(response, extractor, initializer); } @Override protected XStream getXStream() { XStream xstream = super.getXStream(); MyCollectionConverter converter = new MyCollectionConverter(xstream .getMapper()); xstream.registerConverter(converter); return xstream; } public static void main(String[] args) { JSONSerializationCustomized ser = new JSONSerializationCustomized(null, new DefaultTypeNameExtractor(), null); XStream xstream = ser.getXStream(); List l = new ArrayList(); l.add(new Item("a", "b")); l.add(new Item("d", "c")); System.out.println(xstream.toXML(l)); List l2 = (List) xstream.fromXML(xstream.toXML(l)); System.out.println(l2); } } class Item { public String name; public String age; public Item(String name, String age) { super(); this.name = name; this.age = age; } } class MyCollectionConverter extends CollectionConverter { public MyCollectionConverter(Mapper mapper) { super(mapper); } protected void writeItem(Object item, MarshallingContext context, HierarchicalStreamWriter writer) { // PUBLISHED API METHOD! If changing signature, ensure backwards // compatability. if (item == null) { super.writeItem(item, context, writer); } else { String name = mapper().serializedClass(item.getClass()); writer.startNode(name); super.writeItem(item, context, writer); writer.endNode(); } } }