Search code examples
javajsonxstream

XStream 1.4 dropping double quotes when using Converters


I am in the midst of upgrading Xstream 1.3 to 1.4. However I am finding that the JSON generated is incorrect, and I am not sure what I need to do resolve this. I wrote a JUNIT test and was able to reproduce the problem. Here's the code for the test

public class XstreamTest {

     @Test
        public void testXstreamStuffForBasicVO(){
            BasicVO basicVO = new BasicVO("atttr1", "attr2");
            XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
            //XStream xstream = new XStream(new JettisonMappedXmlDriver());
            xstream.setMode(XStream.NO_REFERENCES);
            xstream.registerConverter(new BasicVOConverter());
            System.out.println(xstream.toXML(basicVO));
            //return setupXstream(xstream);
        }

         class BasicVO{
             @XStreamAlias("alias1")
             private String attribute1;

             @XStreamAlias("alias2")
             private String attribute2;

             BasicVO(String att1, String att2){
                 setAttribute1(att1);
                 setAttribute2(att2);
             }

             BasicVO(){

             }

            public String getAttribute1() {
                return attribute1;
            }

            public void setAttribute1(String attribute1) {
                this.attribute1 = attribute1;
            }

            public String getAttribute2() {
                return this.attribute2;
            }

            public String getAttribute3(){
                return "madeupAttribute";
            }

            public void setAttribute2(String attribute2) {
                this.attribute2 = attribute2;
            }

         }


         class BasicVOConverter implements Converter{

            @Override
            public boolean canConvert(Class type) {
                return BasicVO.class.isAssignableFrom(type);
            }

            @Override
            public void marshal(Object source, HierarchicalStreamWriter writer,
                    MarshallingContext context) {


                BasicVO basicVO = (BasicVO) source;

                writer.startNode("property1");
                writer.setValue(basicVO.getAttribute1());
                writer.endNode();

                writer.startNode("property2");
                writer.setValue(basicVO.getAttribute2());
                writer.endNode();

                writer.startNode("property3");
                writer.setValue(basicVO.getAttribute3());
                writer.endNode();

            }

            @Override
            public Object unmarshal(HierarchicalStreamReader reader,
                    UnmarshallingContext context) {
                    BasicVO person = new BasicVO();

                    reader.moveDown();
                    person.setAttribute1(reader.getValue());
                    reader.moveUp();

                    reader.moveDown();
                    person.setAttribute2(reader.getValue());
                    reader.moveUp();


                    return person;
            }

         }
}

The output generated is the following invalid JSON( invalid because the values are not within double quotes )

{"com.xyz.XstreamTest$BasicVO": {
  "property1": atttr1,
  "property2": attr2,
  "property3": madeupAttribute
}}

I would like to point out that, when I use JettisonMappedXmlDriver, this isn't a problem, however, I cannot use this, since I loose some other important things which I get with JsonHierarchicalStreamDriver.

With Xstream 1.3, I get the following

 {"com.xyz.XstreamTest$BasicVO": {
      "property1": "atttr1",
      "property2": "attr2",
      "property3": "madeupAttribute"
    }}

I went through the Xstream 1.4 and 1.3 code and found significant differences. Also, I found differences in the way the logic for quotes is applied. In 1.3, quotes are added more generally. However in 1.4, quotes are only added for a "String" type, which I am not sure how this gets determined.

I am inclining towards maybe some bug in xstream 1.4 code? This seems too far fetched, I am probably missing some step. Can anyone help me to resolve this? Thanks


Solution

  • It seems like this is a current bug, and will be fixed with the next release

    https://jira.codehaus.org/browse/XSTR-728

    Thanks