XStream解析没有根节点的JSON

时间:2009-08-11 22:33:18

标签: java json xstream

我目前正在使用XStream对JSON进行反序列化,并且它一直运行良好。但是,当我有JSON字符串时,如下所示

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

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

3 个答案:

答案 0 :(得分:4)

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

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

  1. 使用包含您的类名(或别名)的根节点手动包装JSON字符串
  2. 编写自己的读者,为您做到这一点。但是,在这种情况下,您仍然需要将您的类名(别名)显式地或按照约定传递给该读取器(例如,总是先添加'root',然后在XStream实例中将其配置为您的类的别名) - 所以我不喜欢我认为这比#1更清洁。

答案 1 :(得分: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。希望这有助于某人。

答案 2 :(得分:2)

使用以下代码:

XStream xstream = new XStream(new JsonHierarchicalStreamDriver() {
    public HierarchicalStreamWriter createWriter(Writer writer) {
        return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
    } });