2012-08-13 6 views
13

Używam Gsona i jestem w sytuacji, w której muszę zmniejszyć rozmiar niektórych ciągów Jsona. Chciałbym to zrobić, aby nie umieszczał pustych obiektów, pustych wartości, pustych list i tablic w łańcuchu Json.Jak sprawić, aby GSON pomijał puste lub puste obiekty oraz puste tablice i listy?

Czy istnieje prosty sposób, aby to zrobić?

Pozwolę sobie trochę wyjaśnić: chcę wszystko, co mówi: emptyProp: {} lub emptyArray: [], aby zostać pominiętym. Chcę, aby każdy obiekt, który zawiera tylko właściwości, które są puste, aby zostać pominiętym.

+3

Czy to nie domyślne zachowanie? – mhusaini

+0

Nie umieszcza pustych tablic itp. – Joe

+4

"umieszcza puste tablice itp." - ??? Polecam opublikować kompletny minimalny przykład tego, o czym mówisz. Dokumenty mówią: "Podczas serializacji, puste pole jest pomijane z wyjścia" (ale nie zdziwiłbym się, gdyby to nie było poprawne). –

Odpowiedz

23

Wartości domyślne są domyślnie wykluczone, o ile nie ustawisz serializeNulls() w GsonBuilderze.

sposób na pustych list jest stworzenie 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; 
    } 
} 

następnie zarejestrować go

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

Czy jesteś pewien, że powyższy kod jest poprawny? Czy wydaje się, że nie wpływa na nic, kiedy go wypróbuję? – bashoogzaad

+0

Tak, to nie działało również dla mnie, dopóki nie zmieniłem 'Collection ' na 'List ', a następnie zadziałało jak powinno –

0

Według PomPom HashMap może odcinkach poprzez:

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; 
     } 
    }