2012-08-13 90 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; 
     } 
    }