J'ai un cours comme le suivant,
public class Student {
public int id;
public String name;
public int age;
}
Maintenant, je veux créer un nouvel étudiant,
//while create new student
Student stu = new Student();
stu.age = 25;
stu.name = "Guna";
System.out.println(new Gson().toJson(stu));
Cela me donne la sortie suivante,
{"id":0,"name":"Guna","age":25} //Here I want string without id, So this is wrong
Alors là, je veux une chaîne comme
{"name":"Guna","age":25}
Si je veux éditer un ancien étudiant
//While edit old student
Student stu2 = new Student();
stu2.id = 1002;
stu2.age = 25;
stu2.name = "Guna";
System.out.println(new Gson().toJson(stu2));
Maintenant, la sortie est
{"id":1002,"name":"Guna","age":25} //Here I want the String with Id, So this is correct
Comment puis-je créer une chaîne JSON avec un champ [à un moment donné], sans champ [à un moment donné].
Toute aide sera très appréciable.
Merci.
Mieux vaut utiliser l'annotation @expose comme
public class Student {
public int id;
@Expose
public String name;
@Expose
public int age;
}
Et utilisez la méthode ci-dessous pour obtenir la chaîne Json de votre objet
private String getJsonString(Student student) {
// Before converting to GSON check value of id
Gson gson = null;
if (student.id == 0) {
gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
} else {
gson = new Gson();
}
return gson.toJson(student);
}
Il ignorera la colonne id s'il est défini sur 0, ou il renverra une chaîne json avec le champ id.
Vous pouvez explorer l'arbre json avec gson.
Essayez quelque chose comme ceci:
gson.toJsonTree(stu1).getAsJsonObject().remove("id");
Vous pouvez également ajouter certaines propriétés:
gson.toJsonTree(stu2).getAsJsonObject().addProperty("id", "100");
Vous avez deux options.
Utilisez le mot-clé transitoire de Java pour indiquer qu'un champ ne doit pas être sérialisé. Gson l'exclura automatiquement. Cela peut ne pas fonctionner pour vous comme vous le souhaitez conditionnellement.
Utilisez l'annotation @Expose pour les champs souhaités et initialisez votre générateur Gson comme suit:
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Vous devez donc marquer les champs de nom et d'âge à l'aide de @Expose et vous devez avoir deux instances Gson différentes pour celle par défaut qui inclut tous les champs et celle ci-dessus qui exclut les champs sans @Expose
annotation.
JsonObject jsObj = (JsonObject) new Gson().toJsonTree(stu2);
jsObj.remove("age"); // remove field 'age'
jsObj.addProperty("key", "value"); // add field 'key'
System.out.println(jsObj);
Vous pouvez manipuler avec JsonObject
Vous devez introduire un champ supplémentaire dans la classe Student
qui notera GSON
à propos de la politique de sérialisation id
. Ensuite, vous devez implémenter un sérialiseur personnalisé qui implémentera TypeAdapter
. Dans votre implémentation de TypeAdapter
selon la politique de sérialisation des identifiants, vous la sérialiserez ou non. Ensuite, vous devez enregistrer votre TypeAdapter
dans l'usine GSON:
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(Student.class, new StudentTypeAdapter());
J'espère que cela t'aides.