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: Как изменить мой сериализатор для работы со всеми элементами, даже сгруппированными?