Xstream 1.3 を 1.4 にアップグレード中です。ただし、生成された JSON が正しくないことがわかりました。これを解決するために何をする必要があるかわかりません。JUNIT テストを作成し、問題を再現できました。ここにテスト用のコードがあります
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;
}
}
}
生成される出力は次の無効な JSON です (値が二重引用符で囲まれていないため無効です)。
{"com.xyz.XstreamTest$BasicVO": {
"property1": atttr1,
"property2": attr2,
"property3": madeupAttribute
}}
JettisonMappedXmlDriver を使用する場合、これは問題ではありませんが、JsonHierarchicalStreamDriver で取得した他の重要なものが失われるため、これを使用することはできません。
Xstream 1.3 では、次のようになります。
{"com.xyz.XstreamTest$BasicVO": {
"property1": "atttr1",
"property2": "attr2",
"property3": "madeupAttribute"
}}
Xstream 1.4 と 1.3 のコードを調べたところ、大きな違いが見つかりました。また、引用符のロジックの適用方法にも違いがあることがわかりました。1.3 では、引用符がより一般的に追加されます。ただし、1.4 では、引用符は「文字列」タイプにのみ追加されます。これがどのように決定されるかはわかりません。
xstream 1.4 コードに何らかのバグがある可能性がありますか? これはあまりにも大げさなようです。おそらくいくつかのステップが欠けています。誰でもこれを解決するのを手伝ってもらえますか? ありがとう