2016-02-11 15 views
7

Gibt es eine einfache Möglichkeit zu konvertieren, wie ein verschachteltes Objekt in JSON konvertiert wird? Ich versuche, nur ein JSON-Objekt zu erstellen, das dem Back-End entspricht. Ich verwende Retrofit für mein Netzwerk, das ein Objekt mit Gson in JSON konvertiert.Gson - Verschachtelte Objekte als Attribute serialisieren

Ich habe keinen Zugriff auf Code zwischen Netzwerkaufruf und der Konvertierung, also versuche ich eine saubere Möglichkeit zu finden, wie das Objekt konvertiert wird, entweder über den GsonBuilder oder Anmerkungen.

// Automatically converted to JSON with passed in Gson. 
Call<myObject> search(@Body foo myFoo); 

public class foo { 
    String text = "boo"; 
    bar b = new bar(); 
} 

public class bar { 
    String other = "moo"; 
} 

Ergebnis:

{ "text": "boo", "b" { "other": "moo" } } 

Gewünschtes Ergebnis:

{ "text": "boo", "other": "moo" } 

Vielen Dank für Ihre Hilfe. :)

+0

Sie könnten die Dummy-Klasse definieren, die für die Konvertierung von JSON nach/von mit anderen verwendet werden soll; Zeichenfolgetext; und Getters Setters dazu. @Awestruck – pratikpawar

Antwort

4

Update Ich schaute in GsonBuilder und ja, Sie können es mit benutzerdefinierten Serialisierung tun. Sie müssen serialize Methode von JsonSerializer<type>

überschreiben. Definieren Sie einfach eine Klasse wie folgt. hier werden nur 2 Eigenschaften hinzugefügt.

public class FooSerialize implements JsonSerializer<foo> { 

@Override 
    public JsonElement serialize(foo obj, Type foo, JsonSerializationContext context) { 

     JsonObject object = new JsonObject(); 
     String otherValue = obj.b.other; 
     object.addProperty("other", otherValue); 
     object.addProperty("text", obj.text); 
     return object; 
    } 
    } 

Erstellen gson Objekt wie folgt.

Gson gson = new GsonBuilder().registerTypeAdapter(foo.class, new FooSerialize()).setPrettyPrinting().create(); 

konvertieren Gerade Json

gson.toJson(fooObject); 

Voila! Wenn es für Sie funktioniert. Ich habe auf meinem System getestet, dass es funktioniert hat. Vergessen Sie nicht, String Override wird für Json zu Obj Konvertierung aufgerufen. Dies ist nur die Serialisierung, die Sie auch für das Deserialisieren des Objekts benötigen. Suchen Sie nach Online-Ressourcen, um eine Idee in ähnlicher Form zu erhalten.

Alternative Lösung wäre dummy pojos nur für JSON-Konvertierung Zwecke zu definieren. Beim Senden von Use Settern Werte zu Pojo-Objekt zuweisen und Gson auf Pojo umgekehrt oder über Lösung verwenden, um benutzerdefinierte Serialisierung und Deserialisierung für Klasse benötigen Sie.

+0

Ich war auf der Suche nach einer allgemeineren Lösung, da meine Bar-Klasse ein paar Variablen enthält, und ich möchte nicht alle Namen fest einprogrammieren. Und ich benutze Retrofit, also benutze ich nur Gson, um das Objekt zu konvertieren, also habe ich keinen Platz zum Telefonieren.toString(); –

+0

Ich habe es gerade versucht, und toString() wurde nie aufgerufen. In Ihrem Beispiel sieht das nicht wie gültiges JSON aus. Ist das etwas anderes? –

+0

Danke für das Update, funktioniert gut! Ich änderte es ein wenig und postete meinen Code als meine eigene Antwort. –

1

Um ein bisschen mehr Details zu dem hinzuzufügen, was ich erreichen wollte, lassen Sie mich zeigen, was ich geschrieben habe, da es vielleicht einem anderen hilft, der versucht, dasselbe zu tun. Während mein übergeordnetes Objekt (foo) nur wenige Variablen hat, hat mein untergeordnetes Objekt (Balken) eine lange Liste möglicher Variablen.

Ich habe herausgefunden, Sie können die Einträge des Kindes durchlaufen und manuell zum Eltern hinzufügen. Leider hat dies den Nebeneffekt, dass häufig unerwünschte Werte wie meine Konstanten oder eine Ganzzahl mit dem Wert "0" hinzugefügt werden.

Ich hoffe, das hilft jemandem.

public class FooSerializer implements JsonSerializer<Foo> { 
    @Override 
    public JsonElement serialize(Foo src, Type typeOfSrc, JsonSerializationContext context) { 
     JsonObject object = new JsonObject(); 

     object.addProperty("text", src.text); 

     bar myBar = src.getBar(); 

     // Using the context to create a JsonElement from the child Object. 
     JsonElement serialize = context.serialize(myBar, bar.class); 
     JsonObject asJsonObject = serialize.getAsJsonObject(); 

     // Getting a Set of all it's entries. 
     Set<Map.Entry<String, JsonElement>> entries = asJsonObject.entrySet(); 

     // Adding all the entries to the parent Object. 
     for (Map.Entry<String, JsonElement> entry : entries) { 
      object.addProperty(entry.getKey(), entry.getValue().toString()); 
     }  

     return object; 
    } 
} 
Verwandte Themen