2012-10-29 13 views
7

Używam GSON do celów mojej serializacji, nie znajduję sposobu na wykluczenie niektórych pól z serializacji na podstawie klasy ExclusionStrategy dostarczonej przez Gson na podstawie wartości pola, ponieważ obsługuje tylko wyłączenia oparte na atrybutach najwyższego poziomu lub atrybutach pól. Atrybuty pól nie zawierają wartości tego pola. Więc co powinienem zrobić?Wyłączenie niektórych pól z serializacji na podstawie wartości w GSON

Odpowiedz

19

Aby to osiągnąć, należy utworzyć niestandardowy serializator dla danej klasy. Po umożliwieniu Gsonowi utworzenia obiektu JSON w sposób domyślny, usuń właściwość, którą chcesz wykluczyć na podstawie jej wartości.

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

I rejestrowanie nowego serializera w obiekcie Gson używanego do serializacji w aplikacji dla tej klasy.

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

@ M-T-A dzięki za edycję. – Atharva

+1

W moim przypadku chciałem usunąć wszystkie fałszywe booleany (cały element), niestety nie jest to możliwe przy użyciu tej metody. Jeśli nauczysz się skutecznego sposobu, aby to zrobić, byłbym szczęśliwy, gdyby się tego nauczyłem. W końcu przechwyciłem wszystkie super obiekty i ręcznie usunąłem każdą fałszywą właściwość boolowską. – Steven

+0

Należy zauważyć, że dokumentacja 'JsonSerializer' mówi:' Nowe aplikacje powinny preferować TypeAdapter, którego streaming API jest bardziej wydajny niż API drzewa tego interfejsu' – user905686

0

Oto przykład bardziej w głębokości klasie napisałem, aby usunąć wszystkie fałszywe wartości logicznych, jak również wszystkie „false” sznurki. Zostało to rzucone dość szybko, ale wydaje się, że działa dobrze. Daj mi znać, jeśli znajdziesz jakieś błędy.

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); 
     } 
    } 
} 
} 
Powiązane problemy