web-dev-qa-db-fra.com

GSON - Sérialiseur personnalisé dans un cas spécifique

J'ai ce schéma:

public class Student {
       public String name;
       public School school;
}

public class School {
       public int id;
       public String name;
}
public class Data {
      public ArrayList<Student> students;
      public ArrayList<School> schools;
}

Je voudrais sérialiser l'objet Data avec Gson et obtenir quelque chose comme:

{ "students": [{ 
                 "name":"name1",
                 "school": "1"          //the id of the scool, not its entire Json
              }],
  "school": [{                        //the entire JSON
              "id" : "1",
              "name": "schoolName"
            }]
}

Pour ce faire, je dois utiliser un sérialiseur personnalisé pour la partie étudiante, afin que Gson n'imprime que l'identifiant de l'école. Mais pour l'école, je dois avoir un sérialiseur nomal.

Comment puis-je tout faire avec un seul objet Gson?

33
Stéphane Piette

Vous pouvez écrire un sérialiseur personnalisé comme ceci:

public class StudentAdapter implements JsonSerializer<Student> {

 @Override
 public JsonElement serialize(Student src, Type typeOfSrc,
            JsonSerializationContext context) {

        JsonObject obj = new JsonObject();
        obj.addProperty("name", src.name);
        obj.addProperty("school", src.school.id);

        return obj;
    }
}
46
Jonas

Bien sûr, partout où vous allez sérialiser cet objet, vous devez l'ajouter au Gson comme ceci:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Student.class, new StudentAdapter())
    .create();
return gson.toJson([YOUR_OBJECT_TO_BE_SERIALIZED]);
29
jobbert