2012-08-13 11 views
13

Sto usando Gson e sono in una situazione in cui devo ridurre le dimensioni di certe stringhe JSON. Vorrei farlo facendo in modo che non inserisca oggetti nulli, solo valori vuoti e liste e matrici vuote nella stringa Json.Come si ottiene GSON per omettere oggetti nulli o vuoti e svuotare array ed elenchi?

C'è un modo semplice per farlo?

Vorrei chiarire un po ': voglio tutto ciò che dice: emptyProp: {} o emptyArray: [] da saltare. Voglio qualsiasi oggetto che contenga solo proprietà vuote da saltare.

+3

Non è che il comportamento predefinito? – mhusaini

+0

No inserisce matrici vuote, ecc. – Joe

+4

"inserisce matrici vuote, ecc." - ??? Raccomando di pubblicare un esempio minimale di ciò di cui stai parlando. I documenti dicono, "Durante la serializzazione, un campo null viene saltato dall'output" (ma non sarei sorpreso se questo non fosse corretto). –

risposta

23

I valori nulli sono esclusi per impostazione predefinita a condizione che non si imposta serializeNulls() su GsonBuilder.

Un modo per le liste vuote è quello di creare 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; 
    } 
} 

quindi registrarlo

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

Sei sicuro che il codice sopra sia corretto? Sembra che non abbia effetto su nulla quando lo provo? – bashoogzaad

+0

Sì, questo non ha funzionato anche per me finché non ho cambiato la 'Collection ' in 'Lista ' e poi ha funzionato come dovrebbe –

0

Secondo PomPom un HashMap può serializzato via:

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