2012-10-29 29 views
7

爲了我的序列化目的,我使用GSON進行序列化時,我沒有找到基於字段值基於Gson提供的基於ExclusionStrategy類的某些字段的方法,因爲它僅支持頂級類或基於字段屬性的排除。字段屬性不包含該字段的值。所以我該怎麼做?根據GSON中的值排除序列化中的某些字段

回答

19

實現此目的的方法是通過爲相關類創建自定義序列化程序。在允許Gson以默認方式創建JSON對象後,根據其值刪除要排除的屬性。

public class SerializerForMyClass implements JsonSerializer<MyClass> { 

    @Override 
    public JsonElement serialize(MyClass obj, Type type, JsonSerializationContext jsc) { 
     Gson gson = new Gson(); 
     JsonObject jObj = (JsonObject)gson.toJsonTree(obj); 
     if(obj.getMyProperty()==0){ 
      jObj.remove("myProperty"); 
     } 
     return jObj; 
    } 
} 

並在您用於該類的應用程序中的序列化的Gson對象中註冊新的序列化程序。

GsonBuilder gsonBuilder = new GsonBuilder(); 
gsonBuilder.registerTypeAdapter(MyClass.class, new SerializerForMyClass()); 
Gson gson=gsonBuilder.create(); 
gson.toJson(myObjectOfTypeMyClass); 
+0

@ M-T-A感謝您的編輯。 – Atharva

+1

在我的情況下,我想刪除所有錯誤的布爾(整個元素),這是不幸的是不可能使用這種方法。如果您瞭解了這樣做的有效方法,我會很樂意瞭解它。我結束了攔截所有超級對象,並手動刪除每個假布爾屬性。 – Steven

+0

注意'JsonSerializer'的文檔說:'新的應用程序應該更喜歡TypeAdapter,它的流API比這個接口的樹API更有效率' – user905686

0

下面是我寫的一個更深入的例子,用於刪除所有假布爾值以及所有「錯誤」字符串。它很快被扔在一起,但似乎工作正常。讓我知道是否有任何錯誤你找到。

public class RemoveFalseJsonSerializer implements JsonSerializer<Object> { 

//~ Methods -------------------------------------------------------------------------------------------------------- 

/** 
* serialize 
* 
* @param object in value 
* @param type in value 
* @param jsonSerializationContext in value 
* 
* @return out value 
*/ 
@Override 
public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonSerializationContext) { 
    Gson gson = new Gson(); 
    JsonElement jsonElement = gson.toJsonTree(object); 
    trimJson(jsonElement); 
    return jsonElement; 
} 

/** 
* We've finally made it to a primitive of some sort. Should we trim it? 
* 
* @param jsonElement in value 
* 
* @return out value 
*/ 
private boolean shouldTrimElement(JsonElement jsonElement) { 
    return jsonElement == null || jsonElement.isJsonNull() 
      || (jsonElement.isJsonPrimitive() 
       && ((jsonElement.getAsJsonPrimitive().isBoolean() && !jsonElement.getAsBoolean()) // trim false 
        || (jsonElement.getAsJsonPrimitive().isString() // also trim the string "false" 
         && "false".equalsIgnoreCase(jsonElement.getAsString())))); 
} 

/** 
* trimJson 
* 
* @param jsonElement in value 
*/ 
private void trimJson(JsonElement jsonElement) { 
    if (jsonElement == null || jsonElement.isJsonNull() || jsonElement.isJsonPrimitive()) { 
     return; 
    } 

    if (jsonElement.isJsonObject()) { 
     List<String> toRemove = new ArrayList<>(); 
     JsonObject asJsonObject = jsonElement.getAsJsonObject(); 
     for (Map.Entry<String, JsonElement> jsonElementEntry : asJsonObject.entrySet()) { 
      if (jsonElementEntry.getValue().isJsonObject() || jsonElementEntry.getValue().isJsonArray()) { 
       trimJson(jsonElementEntry.getValue()); 
      } else if (shouldTrimElement(jsonElementEntry.getValue())) { 
       toRemove.add(jsonElementEntry.getKey()); 
      } 
     } 
     if (CollectionUtils.isNotEmpty(toRemove)) { 
      for (String remove : toRemove) { 
       asJsonObject.remove(remove); 
      } 
     } 
    } else if (jsonElement.isJsonArray()) { 
     JsonArray asJsonArray = jsonElement.getAsJsonArray(); 
     for (JsonElement element : asJsonArray) { 
      trimJson(element); 
     } 
    } 
} 
} 
相關問題