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
7
A
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
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
- 1. Jak włączyć \ wyłączenie formularza frontend dla niektórych pól w yii2?
- 2. Warunkowa walidacja pól na podstawie innych wartości pól w Symfony2
- 3. Django dynamicznie ustawia wartości pól na podstawie innych pól
- 4. Gson dodać pole podczas serializacji
- 5. Formatowanie serializacji kontrolek GSON za pomocą adnotacji
- 6. Wyłączenie niektórych dat z html5 datepicker
- 7. Utrzymywanie tylko niektórych wierszy ramki danych na podstawie zestawu wartości
- 8. Zatwierdzenie formularza Symfony2 na podstawie dwóch pól
- 9. Odzyskiwanie tylko niektórych pól w RedBean
- 10. Tworzenie podzbioru HashMap na podstawie niektórych specyfikacji?
- 11. GSON Integer to Boolean dla konkretnych pól
- 12. SQL - "DISTINCT" na podstawie tylko niektórych kolumn?
- 13. Producent NIE gson umieścić w cudzysłowie nazwy pól
- 14. Inline formset w Django - usunięcie niektórych pól
- 15. R: Wybieranie wierszy z ramki danych na podstawie zestawu wartości pojawiających się w niektórych kolumnach
- 16. Siatka KendoUI - wyłączenie niektórych operatorów filtrów na kolumnę
- 17. LINQ - NIE WYBIERANIE niektórych pól?
- 18. Gson klasa Błąd serializacji com.activeandroid.DatabaseHelper deklaruje wiele pól JSON nazwanych mContext
- 19. Głęboki klon bez niektórych pól
- 20. Suma ścieżkowa niektórych pól w asocjacji - "sum_cache"
- 21. Wyłączenie niektórych funkcji z zakresu pokrycia gcov/lcov
- 22. Czytanie z pliku csv i wyodrębnianie niektórych kolumn danych na podstawie wartości pierwszej kolumny
- 23. Gson deserialize json z różnymi typami wartości
- 24. Pandy odnośników na podstawie wartości
- 25. Elementy interpolujące macierzy kolorów na podstawie niektórych podanych elementów odniesienia.
- 26. Czy można wykluczyć niektórych członków typu z serializacji XmlSerializer?
- 27. Wartości sum w kolumnie na podstawie daty
- 28. Usuń pozycję w słowniku na podstawie wartości
- 29. JSON serializacji opcjonalnych wartości z FsPickler
- 30. Jak znaleźć duplikaty wierszy na podstawie wielu pól w MySQL?
@ M-T-A dzięki za edycję. – Atharva
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
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