2009-08-11 124 views
6

我目前使用XStream反序列化JSON,并且它工作得很好。然而,当我有JSON字符串类似如下XStream解析没有根节点的JSON

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

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

+0

它看起来像一个谈话一直在进行,这是有道理的。它基于XML解析器,并且XML必须包含根节点。看起来答案是“它不能”。 http://www.nabble.com/Serializing-JSON-with-no-root--td21732630.html – 2009-08-11 22:52:16

回答

4

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

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

  1. 手动包含你的类名(或别名)根节点
  2. 编写自己的读者,会为你做你的包裹JSON字符串。然而,在这种情况下,您仍然需要将您的类名称(别名)传递给该读者,无论是显式还是惯例(例如总是预先配置'root',但将其配置为XStream实例中类的别名] - 所以我不认为这比#1更清洁。
+0

你能提供一个如何做选项2的例子吗? – portfoliobuilder 2016-06-30 23:04:48

2

使用下面的代码:

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

如何读取没有根节点的JSON;有没有你可以提供的示例代码? – raffian 2013-01-22 16:32:45

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。希望这可以帮助某人。