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
It seems like this is a current bug, and will be fixed with the next release
https://jira.codehaus.org/browse/XSTR-728
Thanks