2012-08-13 87 views
13

我正在使用Gson,我处于一种情况,我必须缩小某些Json字符串的大小。我希望通过让它不将null对象,只有空值和空列表和数组放入Json字符串中来实现。如何让GSON忽略空或空对象以及空阵列和列表?

有没有简单的方法来做到这一点?让我澄清一下:我希望所有说:emptyProp:{}或emptyArray:[]被跳过。我想要任何只包含空的属性的对象被跳过。

+3

是不是默认行为? – mhusaini 2012-08-13 20:58:04

+0

不,它放入空阵列等。 – Joe 2012-08-13 21:31:46

+4

“它放入空阵列等” - ?我建议发布你正在谈论的完整的最简单的例子。该文档说,“序列化时,从输出中跳过空字段”(但如果这不正确,我不会感到惊讶)。 – 2012-08-13 22:30:48

回答

23

默认情况下排除空值,只要您不将serializeNulls()设置为您的GsonBuilder。

一个空列表的方法是创建一个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; 
    } 
} 

然后将其注册

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

你确定上述代码是正确的吗?当我尝试它时,似乎没有影响任何东西? – bashoogzaad 2015-07-15 14:13:30

+0

是的,直到我将'Collection '更改为'列表',这对我来说才起作用,然后它就像应该那样工作 – 2015-12-05 23:52:24

0

根据PomPom一个HashMap可以通过连载:

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