根据GSON中的值从序列化中排除某些字段

我使用GSON进行序列化,我没有找到根据Gson基于字段值提供的ExclusionStrategy类从序列化中排除某些字段的方法,因为它只支持基于排名的顶级类或字段属性。 字段属性不包括该字段的值。 所以我该怎么做?

实现此目的的方法是为相关类创建自定义序列化程序。 允许Gson以默认方式创建JSON对象后,根据其值删除要排除的属性。

public class SerializerForMyClass implements JsonSerializer { @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 { //~ 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 toRemove = new ArrayList<>(); JsonObject asJsonObject = jsonElement.getAsJsonObject(); for (Map.Entry 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); } } } }