Gson: Custom Serializer не работает для объектов внутри других объектов

Я использую Gson для преобразования java-объекта Saveditem в json-файл, и идея состоит в том, что я хочу управлять сериализованными полями на основе логического флага внутри объекта isGroup.

public class SavedItem {

    public String id;
    public String description;
    public boolean isGroup;
    public ArrayList<SavedItem> list = new ArrayList<SavedItem>();
    public String type;
    public  Point startingPoint ;
    public  double width;
    public double height;
}

Я использовал собственный сериализатор, чтобы проверить значение isGroup и удалить поля на основе значения флага. Если значение равно true, я хочу удалить (начальная точка, тип, ширина и высота), а если оно равно false, я хочу удалить (список).

Пользовательский серлайзер определяется следующим образом:

public class CustomSerializer implements JsonSerializer<SavedItem>  {

@Override
public JsonElement serialize(SavedItem src, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject jObj = (JsonObject)new GsonBuilder().create().toJsonTree(src);
    if (src.isGroup==false){
        jObj.remove("list");
    }
    else{
        jObj.remove("type");
        jObj.remove("startingPoint");
        jObj.remove("width");
        jObj.remove("height");
    }
    return jObj;
}

}

и класс toJsonConverter является следующим:

 Writer writer = new FileWriter(path+"/"+ form.getFormName()+".json");
 Gson gson = new GsonBuilder().registerTypeAdapter(SavedItem.class, new CustomSerializer()).setPrettyPrinting().create();
 JsonObject object = new JsonObject();
 object.addProperty("id", form.getId());
 object.addProperty("formName", form.getFormName());
 JsonElement element = gson.toJsonTree(form.getStructuredFields());
 object.add("StructuredFields", element);
 object.addProperty("imageString", form.getImageString());
 gson.toJson(object,writer);
 writer.close();

Когда преобразованный файл содержал 2 конечных узла (isGroup == false) и одну пустую группу, все работало нормально. Однако когда я начал добавлять элементы в эту группу (в списке), все добавленные элементы вернулись к тому состоянию, в котором они были до использования пользовательского сериализатора. Я также попытался обновить сериализатор таким образом, но проблема все еще существует:

public class CustomSerializer implements JsonSerializer<SavedItem>  {

@Override
public JsonElement serialize(SavedItem src, Type typeOfSrc, JsonSerializationContext context) {
    JsonObject jObj = (JsonObject)new GsonBuilder().create().toJsonTree(src);
    if (src.isGroup==false){
        jObj.remove("list");
    }
    else{
        jObj.remove("type");
        jObj.remove("startingPoint");
        jObj.remove("width");
        jObj.remove("height");
        for (int i=0;i<src.list.size();i++){
            serialize(src.list.get(i), typeOfSrc, context);
        }
    }
    return jObj;
}


}

Это в результате JSON: Как изменить мой сериализатор для работы со всеми элементами, даже сгруппированными?

0 ответов

Другие вопросы по тегам