2012-08-13 19 views
13

Estoy usando Gson y estoy en una situación en la que tengo que reducir el tamaño de ciertas cadenas de Json. Me gustaría hacerlo consiguiendo que no ponga objetos nulos, solo valores vacíos, y listas y matrices vacías en la cadena Json.¿Cómo logras que GSON omita objetos nulos o vacíos y vacíe las matrices y listas?

¿Hay una manera directa de hacerlo?

Permítanme aclarar un poco: quiero que todo lo que dice: emptyProp: {} o emptyArray: [] sea omitido. Quiero que cualquier objeto que solo contenga propiedades que estén vacías se omita.

+3

No es así el comportamiento predeterminado? – mhusaini

+0

No se pone en matrices vacías, etc. – Joe

+4

"pone en matrices vacías, etc." - ??? Recomiendo publicar un ejemplo mínimo completo de lo que estás hablando. Los documentos dicen: "Durante la serialización, se omite un campo nulo de la salida" (pero no me sorprendería que esto no sea correcto). –

Respuesta

23

Los valores nulos están excluidos por defecto siempre que no establezca serializeNulls() en su GsonBuilder.

Una forma de listas vacías es crear un 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; 
    } 
} 

Entonces registrarlo

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

¿Estás seguro de que el código anterior es correcto? ¿No parece afectar nada cuando lo intento? – bashoogzaad

+0

Sí, esto no funcionó para mí también hasta que cambié la 'Colección ' a 'List ' y luego funcionó como debería –

0

Según PomPom un HashMap puede serializado a través de:

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