2012-08-13 8 views
13

Ich benutze Gson und ich bin in einer Situation, in der ich die Größe bestimmter JSON-Strings verkleinern muss. Ich möchte dies tun, indem ich dafür sorge, dass keine Nullobjekte, nur leere Werte und leere Listen und Arrays in die Json-Zeichenkette eingefügt werden.Wie erhalten Sie GSON, um leere oder leere Objekte und leere Arrays und Listen wegzulassen?

Gibt es einen einfachen Weg, das zu tun?

Lassen Sie mich ein wenig verdeutlichen: Ich möchte alles, was sagt: emptyProp: {} oder emptyArray: [] übersprungen werden. Ich möchte, dass ein Objekt, das nur leere Eigenschaften enthält, übersprungen wird.

+3

Ist das nicht das Standardverhalten? – mhusaini

+0

Nein fügt es in leere Arrays usw. – Joe

+4

"es setzt leere Arrays usw." - ??? Ich empfehle, ein vollständiges minimales Beispiel dafür zu veröffentlichen, wovon du sprichst. Die Dokumentation sagt: "Während der Serialisierung wird ein Nullfeld von der Ausgabe übersprungen" (aber ich wäre nicht überrascht, wenn dies nicht korrekt ist). –

Antwort

23

Nullwerte sind standardmäßig ausgeschlossen, solange Sie serializeNulls() nicht auf Ihren GsonBuilder setzen.

Eine Möglichkeit für leere Listen ist eine JsonSerializer

class CollectionAdapter implements JsonSerializer<Collection<?>> { 
    @Override 
    public JsonElement serialize(Collection<?> src, Type typeOfSrc, JsonSerializationContext context) { 
    if (src == null || src.isEmpty()) // exclusion is made here 
     return null; 

    JsonArray array = new JsonArray(); 

    for (Object child : src) { 
     JsonElement element = context.serialize(child); 
     array.add(element); 
    } 

    return array; 
    } 
} 

Dann ist es registrieren

Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(Collection.class, new CollectionAdapter()).create(); 
+0

Sind Sie sicher, dass der obige Code korrekt ist? Es scheint nichts zu beeinflussen, wenn ich es versuche. – bashoogzaad

+0

Ja, das funktionierte auch nicht für mich, bis ich die 'Collection ' in 'List ' änderte und dann funktionierte es wie es sollte –

0

erstellen Nach PomPom kann ein HashMap über serialisiert:

class MapAdapter implements JsonSerializer<Map<?, ?>> { 
     @Override 
     public JsonElement serialize(Map<?, ?> src, Type typeOfSrc,JsonSerializationContext context) { 
      if (src == null || src.isEmpty()) 
       return null; 
      JsonObject obj = new JsonObject(); 
      for (Map.Entry<?, ?> entry : src.entrySet()) { 
       obj.add(entry.getKey().toString(), context.serialize(entry.getValue())); 
      } 
     return obj; 
     } 
    } 
Verwandte Themen