6

我目前正在使用 XStream 反序列化 JSON,并且效果很好。但是,当我有如下 JSON 字符串时

{
    key1: { an_object: { something: 'foobar' } },
    key2: { another_object: { data: 'hi' }
}

最值得注意的是它没有根节点,我不知道如何解析它。基本上,我想要与 DROP_ROOT_NODE 相反的反序列化。

4

3 回答 3

4

简短的回答是“你不能”。

XStream 需要知道要实例化什么类,它从 JSON(或 XML)数据中获取知识。类名可以有别名,但不能省略。您可以通过以下方式解决:

  1. 使用包含您的类名(或别名)的根节点手动包装您的 JSON 字符串
  2. 编写您自己的阅读器,它会为您做到这一点。但是,在这种情况下,您仍然需要显式或按照约定将您的类名(别名)传递给该阅读器(例如,始终在前面加上“root”,然后在 XStream 实例中将其配置为您的类的别名) - 所以我不'认为这比#1 更干净。
于 2009-08-11T22:57:56.297 回答
3

我知道这是一个老问题,但我会在整个早上的谷歌搜索后发布我的解决方案。答案是提供虚拟根节点(开始和终止标签)。为了实现这一点,您最好的朋友之一是 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。希望这可以帮助某人。

于 2013-03-08T17:03:42.563 回答
1

使用以下代码:

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
    } });
于 2011-02-17T05:50:24.477 回答