web-dev-qa-db-fra.com

Créer une chaîne JSON à l'aide de GSON

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.

16
Gunaseelan

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.

23
Pankaj Kumar

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");
3
stacky

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.

2
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

2
Eugene Chipachenko

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.

2
nndru