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).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme mit anderen poster in diesem XStream ist nicht eine gute Passform-ist es ein OXM (Objekt/Xml-Mapper) und JSON abgewickelt wird, da eine sekundäre Ausgabe-format unter Verwendung von XML-Verarbeitung Weg. Dies ist der Grund, warum eine "convention" (wie konvertieren hierarchich xml-Modells in object-graph-Modell von json und Umgekehrt) erforderlich ist; und Ihre Wahl spitzt sich zu verwenden, was ist am wenigsten aufdringlich von sub-optimalen Entscheidungen.
Das funktioniert ok, wenn XML ist Ihre primäre Daten-format, und Sie brauchen nur einige rudimentäre JSON(-like) Unterstützung.
Gute JSON-Unterstützung, würde ich erwägen Sie die Verwendung einer JSON-Verarbeitung-Bibliothek, die nicht real OJM-mapping (ich nehme an, Svensson tut Sie das auch, aber zusätzlich), wie:
Außerdem: selbst wenn Sie tun müssen, um die Unterstützung von XML-und JSON, sind Sie IMO besser mit getrennten Bibliotheken für diese Aufgaben -- Objekte (beans) zur Verwendung auf server-Seite müssen nicht unterschiedlich sein, nur die Serialisierung libs, die Konvertierung zu/von xml-und json.
Ich weiß, das ist off-topic, aber ich würde gerne eine Lösung in Svensson JSON.
Brauchen Sie wirklich öffentlichen Felder in den domain-Klassen? Abgesehen davon, dass Sie mit den Eigenschaften, Svensson können Fälle behandelt werden, wie dies mit einer einfachen JSON-Ausgabe mit einem Diskriminator-Eigenschaft
ausgeben würde JSON wie
könnte analysiert werden, wieder mit code wie diesem
Einem Svensson-Typ-mapper auf der Grundlage der gesamten Klasse name würde wie folgt Aussehen
ist nicht die ideale Umsetzung, wie es übernimmt die Konfiguration des PropertyValueBasedTypeMapper, ohne Sie wirklich zu benötigen. (sollte eine sauberere version in Svensson)
Das setup ist sehr ähnlich wie oben