Java 使用XStream将XML转换为JSON时忽略空格
我正在尝试建立一种使用Java将XML转换为JSON的可靠、快速的方法,我已经开始使用它来执行这项任务。但是,当我运行下面的代码时,测试由于空格(包括换行符)而失败,如果我删除这些字符,那么测试将通过Java 使用XStream将XML转换为JSON时忽略空格,java,xml,json,xstream,Java,Xml,Json,Xstream,我正在尝试建立一种使用Java将XML转换为JSON的可靠、快速的方法,我已经开始使用它来执行这项任务。但是,当我运行下面的代码时,测试由于空格(包括换行符)而失败,如果我删除这些字符,那么测试将通过 @Test public void testXmlWithWhitespaceBeforeStartElementCanBeConverted() throws Exception { String xml = "<root&g
@Test
public void testXmlWithWhitespaceBeforeStartElementCanBeConverted() throws Exception {
String xml =
"<root>\n" +
" <foo>bar</foo>\n" + // remove the newlines and white space to make the test pass
"</root>";
String expectedJson = "{\"root\": {\n" +
" \"foo\": bar\n" +
"}}";
String actualJSON = transformXmlToJson(xml);
Assert.assertEquals(expectedJson, actualJSON);
}
private String transformXmlToJson(String xml) throws XmlPullParserException {
XmlPullParser parser = XppFactory.createDefaultParser();
HierarchicalStreamReader reader = new XppReader(new StringReader(xml), parser, new NoNameCoder());
StringWriter write = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(write);
HierarchicalStreamCopier copier = new HierarchicalStreamCopier();
copier.copy(reader, jsonWriter);
jsonWriter.close();
return write.toString();
}
有没有办法告诉复制过程忽略可忽略的空白。我找不到任何明显的方法来促成这种行为,但我认为应该存在。我知道我可以预处理XML以删除空白,或者使用其他库
更新
我可以使用HierarchycalStreamReader接口的装饰器并手动抑制空白节点来解决这个问题,但这仍然感觉不太理想。这看起来像下面的代码,这将使测试通过
public class IgnoreWhitespaceHierarchicalStreamReader implements HierarchicalStreamReader {
private HierarchicalStreamReader innerHierarchicalStreamReader;
public IgnoreWhitespaceHierarchicalStreamReader(HierarchicalStreamReader hierarchicalStreamReader) {
this.innerHierarchicalStreamReader = hierarchicalStreamReader;
}
public String getValue() {
String getValue = innerHierarchicalStreamReader.getValue();
System.out.printf("getValue = '%s'\n", getValue);
if(innerHierarchicalStreamReader.hasMoreChildren() && getValue.length() >0) {
if(getValue.matches("^\\s+$")) {
System.out.printf("*** White space value suppressed\n");
getValue = "";
}
}
return getValue;
}
// rest of interface ...
非常感谢您的帮助。将两个XML作为字符串对象进行比较不是一个好主意。当xml相同但节点顺序不同时,您将如何处理这种情况 e、 g
12
类似于
<xml><node2>2</node2><node1>1</node1></xml>
21
但是,当您进行字符串比较时,它总是返回false
相反,请使用XMLUnit之类的工具。有关更多详细信息,请参阅以下链接
谢谢您的回复,但我不知道在哪里比较XML。你的意思是在我删除空白的除颤器内吗?我的意思是当你调用Assert.assertEquals时。这两个参数都是字符串对象,因此将调用String.equals()方法。相反,您必须创建XMLObject类重写它的equals方法来进行XML比较。我同意,如果JSON字符串的内容可能不准确,因此测试可能会失败(但我没有走那么远),我应该测试等价性。测试仅以这种方式显示是为了简洁,而不是引发异常的原因。
<xml><node1>1</node1><node2>2</node2></xml>
<xml><node2>2</node2><node1>1</node1></xml>