2012-04-05 9 views
1

Wie kann ich bestimmte Werte beim Serialisieren eines Objektmodells in JSON mit GSON umbrechen? Beispielmodell:Bestimmte Werte bei der Serialisierung von JSON mit Gson übertragen

class Order { 
    Customer cust; 
} 

class Customer { 
    String name; 
    int age; 
} 

einen Kunden Serialisierung normalerweise etwas ergeben würde wie:

{cust:{name:joe, age:21}} 

Was ich möchte, ist die Auftrags- und Kundenwerte in einem zusätzlichen Elemente mit dem Klassennamen tun wickeln. So ist die erwartete JSON wäre:

{Order:{cust:Customer:{name:joe, age:21}}} 

Die tatsächlichen Klassen, die ich Serialisierung werde alles sein könnte, so kann ich nicht spezifische Eigenschaften in einem Serializer codieren. Aber ich möchte bestimmte Eigenschaften mit ihrem Klassennamen umhüllen.

Wie kann ich das tun?

+0

Sie Sie * unbedingt * die Verpackung benötigen Teil, oder können Sie eine ähnliche Funktionalität erreichen, indem Sie Ihren Modellobjekten ein "clazz" -Feld hinzufügen? – Raffaele

+0

Ich besitze nicht die Objekte, die ich serialisieren und deserialisieren werde, also kann ich ihnen nichts hinzufügen. – Josh

+0

Sicher, aber zur Zeit der Serialisierung können Sie ein 'clazz'-Feld hinzufügen, das den vollständig qualifizierten Klassennamen enthält. Wenn Sie also deserialisieren, können Sie das' clazz' lesen und den Java-Typ mit 'Class.forName' zurückbekommen. Sie müssen dies nur für das Root-Element tun, da Sie dann die Standard-Gson-Routinen verwenden können. Ich habe tief in die Gson API und Quellen geschaut, und es scheint, dass die Art von * Dekoration *, die Sie suchen, unmöglich ist (zumindest fand ich keinen einfachen Weg, ohne die Quellen zu modifizieren). Es gibt natürlich andere Bibliotheken, und Sie könnten versuchen, anzugeben, warum der Typ der Antwort unbekannt ist. – Raffaele

Antwort

0

Dies ist kein gültiges JSON-String aber:

{Order:{cust:Customer:{name:joe, age:21}}} 

In Ihrem Antrag, Sie haben Ihre Domain-Klasse zu modellieren/Arbeitsgeräte richtig, bevor es für die Serialisierung verwendet werden kann/Deserialisierung json string, in einem anderen Wort, Die Domänenklasse sollte vor dem Aufruf der Methode json/fromJson bekannt sein. Der tatsächliche Domänenklassentyp kann jedoch zur Laufzeit dynamisch ermittelt werden, indem Java Generic Type verwendet wird.

Schauen Sie sich den Abschnitt Serializing and Deserializing Generic Types von Gson Benutzerhandbuch:

public class Foo<T> { 
    public T value; 
} 

es zu serialisieren:

Gson gson = new Gson(); 
Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 
gson.toJson(foo, fooType); 

es deserialisieren:

Gson gson = new Gson(); 
Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); 
gson.fromJson(json, fooType); 
+0

Der Punkt ist, dass ich * nicht weiß, zu welcher Klasse ich Deserialisierung bin - deshalb möchte ich bestimmte Elemente in den Klassennamen einbinden. – Josh

+0

Wenn der Klassentyp unbekannt ist, ist es nicht erforderlich, diesen Teil der JSON-Zeichenfolge für ein konkretes Java-Objekt zu deserialisieren. Wahrscheinlich können Sie Ihre json string ändern und mehrere json fileds/infos als eine rohe Zeichenfolge organisieren, wenn Sie diese mit serverize/deserialize mit gson bearbeiten, werden diese mehreren json Felder/Infos als regulärer Java String Typ behandelt. – yorkw

Verwandte Themen