爲了我的序列化目的,我使用GSON進行序列化時,我沒有找到基於字段值基於Gson提供的基於ExclusionStrategy類的某些字段的方法,因爲它僅支持頂級類或基於字段屬性的排除。字段屬性不包含該字段的值。所以我該怎麼做?根據GSON中的值排除序列化中的某些字段
7
A
回答
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
下面是我寫的一個更深入的例子,用於刪除所有假布爾值以及所有「錯誤」字符串。它很快被扔在一起,但似乎工作正常。讓我知道是否有任何錯誤你找到。
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);
}
}
}
}
相關問題
- 1. GSON序列化 - 如何從序列化中排除某些字段,但不是反序列化
- 2. 排除HABTM中的某些字段find()
- 3. Java Gson序列化期間排除字段
- 4. Gson - 簡化一些字段的序列化
- 5. 排除tastypie發佈數據中的某些字段
- 6. 根據對象列表中某些字段的值生成列表
- 7. 防止某些字段被序列化
- 8. GSON - 基於字段值排除對象
- 9. MySql查詢根據某些列字段從表中刪除重複的行?
- 10. 如何反序列化JSON中的某些字段?
- 11. Silverlight項目中的反序列化後,某些字段爲空
- 12. 使用Gson序列化JSON時包裝某些值
- 13. GSON系列化:排除給定一個POJO某些字段如果爲空,但不是所有的人都
- 14. 排除數組中的某些字
- 15. 根據字典中的值排序字符串的列表
- 16. Spring initBinder StringTrimmerEditor - 排除某些字段
- 17. 標識XSLT排除某些字段
- 18. HTML5 localStorage,如何排除某些字段
- 19. 如何根據我的條件對某些字段進行排序的表
- 20. 根據mysql數據庫中列的數量刪除某些行
- 21. SQL - 排除某些時段
- 22. 排除某些字段的NULL或EMPTY值
- 23. 根據參數化SQL查詢在Spark Dataframe中添加列,這取決於數據幀某些字段的值。
- 24. MySQL:根據值排除列
- 25. 解析列中的值,同時排除其他列中的某些值
- 26. 排除字段中的某些項目在MySQL
- 27. python根據json字段中的值排序django模型
- 28. 對象字段反序列化與GSON
- 29. Gson與動態字段序列化
- 30. 根據字段列表中的某個值獲取哈希字段
@ M-T-A感謝您的編輯。 – Atharva
在我的情況下,我想刪除所有錯誤的布爾(整個元素),這是不幸的是不可能使用這種方法。如果您瞭解了這樣做的有效方法,我會很樂意瞭解它。我結束了攔截所有超級對象,並手動刪除每個假布爾屬性。 – Steven
注意'JsonSerializer'的文檔說:'新的應用程序應該更喜歡TypeAdapter,它的流API比這個接口的樹API更有效率' – user905686