我目前正在使用 XStream 反序列化 JSON,并且效果很好。但是,当我有如下 JSON 字符串时
{
key1: { an_object: { something: 'foobar' } },
key2: { another_object: { data: 'hi' }
}
最值得注意的是它没有根节点,我不知道如何解析它。基本上,我想要与 DROP_ROOT_NODE 相反的反序列化。
简短的回答是“你不能”。
XStream 需要知道要实例化什么类,它从 JSON(或 XML)数据中获取知识。类名可以有别名,但不能省略。您可以通过以下方式解决:
我知道这是一个老问题,但我会在整个早上的谷歌搜索后发布我的解决方案。答案是提供虚拟根节点(开始和终止标签)。为了实现这一点,您最好的朋友之一是 SequenceInputStream:
我的代码如下:
reader = new XppDriver().createReader(new SequenceInputStream(
Collections.enumeration(Arrays.asList(
new InputStream[] {
new ByteArrayInputStream("<PlatformAuditEvents>".getBytes()),
new FileInputStream(file),
new ByteArrayInputStream("</PlatformAuditEvents>".getBytes())
}))
));
in = xstream.createObjectInputStream(reader);
在这里,我混合了三个 InputStream 对象,第一个和第三个对象提供了处理的文件中缺少的所需标签。
这个解决方案的灵感来自这个SO Question。希望这可以帮助某人。
使用以下代码:
XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
} });