2016-05-31 12 views
2

Ich versuche, ein Objekt zu serialisieren. Ich habe folgende Struktur:Gson entfernen unnötige verschachtelte Objektfelder

Class A{ 
String aField1; 
String aField2; 
B bObj; 
} 
Class B{ 
String bField1; 
String bField2; 
String bField3;  
} 

Ich versuche, Klasse A und B Objekte zu serialisieren, um sie an den Server zu senden. Wenn ich Klasse A Objekt am Serialisierung, gibt es mir

{ 
aField1: "abc", 
aField2: "def", 
B: { 
    bField1: "mnp", 
    bField2: "qrt", 
    bField3: "xyz", 
    } 
} 

Und Serialisierung Klasse B obj:

{ 
bField1: "mnp", 
bField2: "qrt", 
bField3: "xyz", 
} 

Aber ich will Klasse A Objekt wie folgt:

{ 
aField1: "abc", 
aField2: "def", 
B: { 
    bField1: "mnp" 
    } 
} 

Ich verwende derzeit GSON Bibliothek, um dies zu erreichen. Ich möchte zusätzliche Schlüsselwertpaare bei der Interaktion mit dem Server entfernen. Wie kann ich das tun?

+0

der '@ Expose' Anmerkung https://github.com/google/gson/blob/master/UserGuide.md#TOC-Gson-s-Expose Verwenden Sie genau auswählen, welche Felder sind serialisiert –

+0

Ich brauche alle diese Felder in während der Serialisierung Klasse B obj. –

+1

Die Verwendung von Ausschlussstrategie ist die Lösung für dieses Problem. http://StackOverflow.com/a/4803346/2920114 –

Antwort

0

Ändern Sie Ihre Serialize-Klasse wie folgt.

public class A implements Serializable{ 
    String aField1; 
    String aField2; 
    B bObj; 

    class B{ 
     String bField1; 
     String bField2; 
     String bField3; 
    } 
} 

Entfernen Sie einfach die zusätzlichen Felder. Es wird kein Problem machen.

+0

Ich brauche diese Felder. –

+0

Überprüfen Sie die Antwort, ich habe es aktualisiert. –

+0

@AbhishekLodha, hast du meinen letzten aktualisierten Code getestet? –

0

Sie können bField2 und bField3 als transient markieren oder die Annotation @Expose(serialize = false) verwenden.

Oder Sie können Ihre Serialisierungsausschlussstrategie anpassen.
Beispielcode:

GsonBuilder builder = new GsonBuilder(); 
Type type = new TypeToken <A>(){}.getType(); 
builder.addSerializationExclusionStrategy(
     new ExclusionStrategy() { 
      @Override 
      public boolean shouldSkipField(FieldAttributes fieldAttributes) { 
       return fieldAttributes.getName().equals("bField2") || 
          fieldAttributes.getName().equals("bField3"); 
      } 
      @Override 
      public boolean shouldSkipClass(Class<?> aClass) { 
       return false; 
      } 
     } 
); 
+0

@emecas danke, ich habe diesen Tippfehler behoben – AnnabellChan

+0

Kein Problem :), was ist mit der zweiten Zeile 'Type', gibt es einen Grund, es zu behalten? – emecas

Verwandte Themen