阻止Gson序列化列表中的对象

时间:2014-09-11 08:34:30

标签: java json gson

使用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"
        }
    }
]

1 个答案:

答案 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);
    }
}