使用Gson序列化Java对象列表时,我希望过滤对象,以便只序列化状态字段中具有特定值的对象。到目前为止,我已经提出使用两个Gson实例,一个带有自定义序列化器,一个没有
...
gson = gsonBuilder.create();
gsonBuilder.registerTypeAdapter(PropertyValue.class, new PropertyValueSerializer());
strictGson = gsonBuilder.create();
其中PropertyValueSerializer如下所示:
public static class PropertyValueSerializer implements JsonSerializer<PropertyValue> {
@Override
public JsonElement serialize(PropertyValue propertyValue, Type typeOfT, JsonSerializationContext context) {
PropertyStatus propertyStatus = propertyValue.getStatus();
if (propertyStatus == null || propertyStatus.isIndex()) {
return gson.toJsonTree(propertyValue);
} else {
return null;
}
}
}
即,如果状态字段指示不应序列化PropertyValue,则使用默认序列化或返回null。这会执行,但是返回null显然无法从序列化中排除PropertyValue对象,因为我得到这样的JSON:
[
{
"status": "HasDraft",
"sourceInfo": {
"author": "UUU",
"refId": "6aad7da8-e635-461d-8d42-c9a8aecd61fc"
},
"valueType": "TEXT",
"value": {
"sv": "Rojo"
}
},
null
]
有没有办法排除第二个PropertyValue对象,所以我得到
[
{
"status": "HasDraft",
"sourceInfo": {
"author": "UUU",
"refId": "6aad7da8-e635-461d-8d42-c9a8aecd61fc"
},
"valueType": "TEXT",
"value": {
"sv": "Rojo"
}
}
]
答案 0 :(得分:0)
回答我自己的问题,我发现了如何做到这一点。我需要List而不是PropertyValue的自定义序列化程序。在此我使用默认序列化之前过滤列表:
public static class PropertyValuesSerializer implements JsonSerializer<List<PropertyValue>> {
@Override
public JsonElement serialize(List<PropertyValue> propertyValues, Type typeOfT, JsonSerializationContext context) {
List<PropertyValue> filtered = new ArrayList<>();
for (PropertyValue propertyValue : propertyValues) {
PropertyStatus propertyStatus = propertyValue.getStatus();
if (propertyStatus == null || propertyStatus.isIndex()) {
filtered.add(propertyValue);
}
}
return gson.toJsonTree(filtered);
}
}