XStream解析没有根节点的JSON

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

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

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

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

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

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

我知道这是一个老问题,但是我会在整个上午谷歌搜索后发布我的解决方案。 答案是提供虚拟根节点(开始和终止标记)。 为了实现这一目标,你最好的朋友之一是SequenceInputStream:

我的代码如下:

  reader = new XppDriver().createReader(new SequenceInputStream( Collections.enumeration(Arrays.asList( new InputStream[] { new ByteArrayInputStream("".getBytes()), new FileInputStream(file), new ByteArrayInputStream("".getBytes()) })) )); in = xstream.createObjectInputStream(reader); 

在这里,我混合了三个InputStream对象,它们是第一个和第三个,它们提供了处理文件中缺少的必需标记。

这个解决方案的灵感来自于这个SO问题 。 希望这有助于某人。

使用以下代码:

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