2014-09-11 62 views
0

使用Gson序列化Java對象列表時,我希望對象進行過濾,以便只有在狀態字段中具有特定值的對象才被序列化。到目前爲止,我想出了使用兩個GSON情況下,一個具有自定義序列,一個沒有停止Gson從序列化列表中的對象

... 
gson = gsonBuilder.create(); 

gsonBuilder.registerTypeAdapter(PropertyValue.class, new PropertyValueSerializer()); 
strictGson = gsonBuilder.create(); 

其中PropertyValueSerializer看起來是這樣的:

public static class PropertyValueSerializer implements JsonSerializer<PropertyValue> { 
    @Override 
    public JsonElement serialize(PropertyValue propertyValue, Type typeOfT, JsonSerializationContext context) { 
     PropertyStatus propertyStatus = propertyValue.getStatus(); 
     if (propertyStatus == null || propertyStatus.isIndex()) { 
      return gson.toJsonTree(propertyValue); 
     } else { 
      return null; 
     } 
    } 
} 

也就是說,使用默認序列化或返回null狀態字段指示PropertyValue不應被序列化。這會執行,但返回null顯然不能從系列化排除對象的PropertyValue工作,我得到JSON這樣的:

[ 

    { 
     "status": "HasDraft", 
     "sourceInfo": { 
      "author": "UUU", 
      "refId": "6aad7da8-e635-461d-8d42-c9a8aecd61fc" 
     }, 
     "valueType": "TEXT", 
     "value": { 
      "sv": "Rojo" 
     } 
    }, 
    null 
] 

有沒有辦法排除第二個對象的PropertyValue所以我得到

[ 

    { 
     "status": "HasDraft", 
     "sourceInfo": { 
      "author": "UUU", 
      "refId": "6aad7da8-e635-461d-8d42-c9a8aecd61fc" 
     }, 
     "valueType": "TEXT", 
     "value": { 
      "sv": "Rojo" 
     } 
    } 
] 

回答

0

回答我自己的問題,我發現如何去做。我需要一個List而不是PropertyValue的自定義序列化程序。在我使用默認序列之前過濾列表:

public static class PropertyValuesSerializer implements JsonSerializer<List<PropertyValue>> { 
    @Override 
    public JsonElement serialize(List<PropertyValue> propertyValues, Type typeOfT, JsonSerializationContext context) { 
     List<PropertyValue> filtered = new ArrayList<>(); 
     for (PropertyValue propertyValue : propertyValues) { 
      PropertyStatus propertyStatus = propertyValue.getStatus(); 
      if (propertyStatus == null || propertyStatus.isIndex()) { 
       filtered.add(propertyValue); 
      } 
     } 
     return gson.toJsonTree(filtered); 
    } 
} 
+1

「新的應用程序應該更喜歡TypeAdapter,其流API比這個接口的API樹更有效。」您應該更好地使用TypeAdapters來提高效率。 – Devrim 2014-09-20 15:49:23

+0

謝謝愛琴海,將研究這一點,因爲我還發現我的解決方案存在缺陷(處理遞歸結構)。 – 2014-09-21 18:54:15