2009-08-11 6 views
6

Ich bin derzeit Deserialisierung von JSON mit XStream, und es hat gut funktioniert. Allerdings, wenn ich JSON-String wie folgtXStream Parse JSON ohne Root-Knoten

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

vor allem hat es keinen Root-Knoten haben, ich bin nicht sicher, wie es zu analysieren. Grundsätzlich möchte ich das Gegenteil von DROP_ROOT_NODE für die Deserialisierung.

+0

Es sieht aus wie eine Unterhaltung darüber gegangen ist, und es macht Sinn. Es basiert auf einem XML-Parser und XML muss einen Wurzelknoten enthalten. Sieht aus wie die Antwort ist "es kann nicht". http://www.nabble.com/Serializing-JSON-with-no-root--td21732630.html –

Antwort

4

Die kurze Antwort lautet "Sie können nicht".

XStream muss wissen, welche Klasse instanziiert werden soll, es erhält dieses Wissen aus JSON- (oder XML-) Daten. Klassenname kann Alias ​​sein, aber er kann nicht weggelassen werden. Sie können arbeiten, um:

  1. manuell Ihre JSON-String mit Wurzelknoten Einwickeln Ihre Klassennamen enthält (oder Alias)
  2. Ihre eigenen Leser zu schreiben, die es für Sie tun würde. In diesem Fall müssen Sie jedoch Ihren Klassennamen (Alias) entweder explizit oder per Konvention an diesen Leser übergeben (z. B. immer "root" voranstellen und dann als Alias ​​für Ihre Klasse in der XStream-Instanz konfigurieren) Ich denke, das ist sauberer als # 1.
+0

Können Sie ein Beispiel für die Option 2 angeben? – portfoliobuilder

2

den Code unten verwenden:

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

Was ist mit JSON ohne einen Wurzelknoten lesen; Gibt es Beispielcode, den Sie bereitstellen können? – raffian

3

Ich weiß, dass dies eine alte Frage ist, aber ich werde meine Lösung nach einem ganzen Morgen googeln posten. Die Antwort besteht darin, einen Dummy-Stammknoten (Start- und Terminierungstags) bereitzustellen. Um dies zu erreichen, einer Ihrer besten Freunde ist SequenceInputStream:

Mein Code ist folgende:

 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); 

Hier habe ich drei Input Objekte gemischt haben, die ersten und dritten sind diejenigen, die Bereitstellung der erforderlichen Tags fehlen in der bearbeiteten Datei.

Diese Lösung wurde von dieser SO Question inspiriert. Hoffe, das hilft jemandem.