In XStream gibt es einen besseren Weg, um marshall/unmarshall-Liste<Object>'s in JSON und Java

Ich bin mit XStream und JETTISON ist Stax JSON serializer zum senden/empfangen von Nachrichten an/von JSON-javascript-clients und Java-web-Anwendungen.

Ich möchte in der Lage sein erstellen Sie eine Liste der Objekte an den server gesendet werden und richtig umgewandelt werden in Java aber das format, dass XStream und JSON erwarten, dass es in ist nicht sehr intuitiv und erfordert unser javascript-Bibliotheken, um durch Reifen springen.

[BEARBEITEN Update Probleme mit GSON Bibliothek]
Ich habe versucht, verwenden Sie die GSON-Bibliothek aber es kann nicht deserialisiert werden konkrete Objekte, wenn ich nur erwarten, generischen super-Klassen (XStream und Jettison behandelt diesen da-Typ-Informationen ist gebacken in der Serialisierung).

GSON FAQ Staaten-Sammlung Einschränkung:

Sammlungen Einschränkungen

Kann serialisieren Sammlung von beliebigen Objekten können aber nicht Deserialisieren von es

Weil es keine Möglichkeit für den Benutzer, um anzugeben, die Art des resultierenden Objekts

Beim Deserialisieren, Kollektion muss von einer bestimmten generischen Typ

Vielleicht bin ich auch mit schlechten java-Praktiken, aber wie würde ich mich über den Aufbau einer JSON zu Java-messaging-framework, dass die gesendete/empfangene verschiedenen konkreten Message-Objekten in JSON-format?

Zum Beispiel das fehlschlägt:

public static void main(String[] args) {
    Gson gson = new Gson();

    MockMessage mock1 = new MockMessage();
    MockMessage mock2 = new MockMessage();
    MockMessageOther mock3 = new MockMessageOther();

    List<MockMessage> messages = new ArrayList<MockMessage>();
    messages.add(mock1);
    messages.add(mock2);
    messages.add(mock3);

    String jsonString = gson.toJson(messages);

    //JSON list format is non-intuitive single element array with class name fields
    System.out.println(jsonString);
    List gsonJSONUnmarshalledMessages = (List)gson.fromJson(jsonString, List.class);
    //This will print 3 messages unmarshalled
    System.out.println("XStream format JSON Number of messages unmarshalled: " + gsonJSONUnmarshalledMessages.size());
}

[{"val":1},{"val":1},{"otherVal":1,"val":1}]
Exception in thread "main" com.google.gson.JsonParseException: The JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@638bd7f1 failed to deserialized json object [{"val":1},{"val":1},{"otherVal":1,"val":1}] given the type interface java.util.List

Hier ist ein Beispiel, ich möchte zum senden einer Liste von 3-Message-Objekte, 2 sind von dem selben Typ und der 3. ist ein anderer Typ.

import java.util.ArrayList;
import java.util.List;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

class MockMessage {
    int val = 1;
}
class MockMessageOther {
    int otherVal = 1;
}

public class TestJSONXStream {


    public static void main(String[] args) {
        JettisonMappedXmlDriver xmlDriver = new JettisonMappedXmlDriver();        
        XStream xstream = new XStream(xmlDriver);

        MockMessage mock1 = new MockMessage();
        MockMessage mock2 = new MockMessage();
        MockMessageOther mock3 = new MockMessageOther();

        List messages = new ArrayList();
        messages.add(mock1);
        messages.add(mock2);
        messages.add(mock3);

        String jsonString = xstream.toXML(messages);

        //JSON list format is non-intuitive single element array with class name fields
        System.out.println(jsonString);
        List xstreamJSONUnmarshalledMessages = (List)xstream.fromXML(jsonString);
        //This will print 3 messages unmarshalled
        System.out.println("XStream format JSON Number of messages unmarshalled: " + xstreamJSONUnmarshalledMessages.size());

        //Attempt to deserialize a reasonable looking JSON string
        String jsonTest = 
              "{"+
                "\"list\" : ["+ 
                          "{"+
                          "\"MockMessage\" : {"+
                              "\"val\" : 1"+
                          "}"+
                      "}, {"+
                          "\"MockMessage\" : {"+
                              "\"val\" : 1"+
                          "}"+
                      "}, {"+
                          "\"MockMessageOther\" : {"+
                              "\"otherVal\" : 1"+
                          "}"+
                      "} ]"+
                  "};";

        List unmarshalledMessages = (List)xstream.fromXML(jsonTest);

        //We expect 3 messages but XStream only deserializes one
        System.out.println("Normal format JSON Number of messages unmarshalled: " + unmarshalledMessages.size());
    }

}

Intuitiv erwarte ich den XStream JSON serialisiert werden (und in der Lage zu Deserialisieren korrekt) aus dem folgenden format:

{
    "list" : [ 
        {
        "MockMessage" : {
            "val" : 1
        }
    }, {
        "MockMessage" : {
            "val" : 1
        }
    }, {
        "MockMessageOther" : {
            "otherVal" : 1
        }
    } ]
}

Statt XStream erstellt ein einzelnes element der Liste der Felder, Namen, Klassennamen und verschachtelte arrays von Objekten des gleichen Typs.

{
    "list" : [ {
        "MockMessage" : [ {
            "val" : 1
        }, {
            "val" : 1
        } ],
        "MockMessageOther" : {
            "otherVal" : 1
        }
    } ]
}

Die Mühe kann verursacht werden, indem es mit der XStream XML CollectionConverter?

Hat jemand einen Vorschlag für eine gute JSON-Java-Objekt-Serialisierung, die es Ihnen ermöglicht zu Lesen/schreiben beliebiger Java-Objekte. Ich schaute auf die Jackson Java JSON-Processor aber wenn Sie Lesen würden, in der Objekte aus einem stream, man musste angeben, welche Art von Objekt es war im Gegensatz zu XStream, wo Sie gelesen werden, in jedem Objekt (da der XStream serialisiert JSON-Klasse enthält Informationen zu Namen).

InformationsquelleAutor Dougnukem | 2009-05-07
Schreibe einen Kommentar