根据GSON中的值从序列化中排除某些字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据GSON中的值从序列化中排除某些字段相关的知识,希望对你有一定的参考价值。
我使用GSON进行序列化,我没有找到根据Gson基于字段值提供的ExclusionStrategy类从序列化中排除某些字段的方法,因为它只支持基于排名的顶级类或字段属性。字段属性不包括该字段的值。所以我该怎么做?
答案
实现此目的的方法是为相关类创建自定义序列化程序。允许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);
另一答案
这是我写的一个更深入的例子,用于删除所有假布尔值以及所有“假”字符串。它很快被抛到一起,但似乎工作正常。如果您发现任何错误,请告诉我。
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);
}
}
}
}
以上是关于根据GSON中的值从序列化中排除某些字段的主要内容,如果未能解决你的问题,请参考以下文章
VBA代码根据excel工作簿中的值从webform下拉列表中选择一个值