2009-08-11 122 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。希望這可以幫助某人。