web-dev-qa-db-fra.com

Gson: @Expose vs @SerializedName

En ce qui concerne Gson, quelle est la différence entre @Expose Et @SerializedName("stringValue")?

46
Ahmed

@SerializeName est utilisé pour définir la clé que l’objet json doit inclure, cependant @Expose est utilisé pour décider si la variable sera exposée pour la sérialisation et la désérialisation, ou non. Voici la documentation de @Expose.

70
Gavriel

Même s'il est tard, je voulais répondre à cette question. Pour l'expliquer, nous devons savoir ce qui est serialization et deserialization. serialization est en train de convertir object en json string et deserialization est en train de convertir json string dans object.

Disons que nous avons la classe User sans annotations.

public class User{
    private String userName;
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}

Et nous serialize ceci object comme ci-dessous

User user = new User("Ahmed", 30);
Gson gson = new Gson();
String jsonString = gson.toJson(user);

Chaîne Json sera comme ça

{
    "userName":"Ahmed",
    "userAge":30
}

Si nous ajoutons l'annotation @SerializedName

public class User{

    @SerializedName("name")
    private String userName;
    @SerializedName("age")
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}

Chaîne Json sera comme ça

{
    "name":"Ahmed",
    "age":30
}

@Expose est utilisé pour autoriser ou interdire serialization et deserialization. @Expose est facultatif et comporte deux paramètres de configuration: serialize et deserialize. Par défaut, ils sont définis sur true. Pour serialize et deserialize avec @Expose on crée un objet gson comme celui-ci

Gson gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

Au-dessous de userName ne sera pas désérialisé. La valeur de userName sera null.

@SerializedName("name")
@Expose(deserialize = false)
private String userName;

Au-dessous de userName ne sera pas sérialisé.

@SerializedName("name")
@Expose(serialize = false)
private String userName;

La chaîne Json sera comme ça. Seul userAge sera désérialisé.

{
    "age":30
}
66
Bek
class Person{
String name;
String password;
}

supposons que si je mets i annotation Expose au-dessus d'un nom de variable ou d'un mot de passe sans SerializedName, il sera sérialisé en tant que nom de variable

Mais si nous mettons SerializedName comme ("nom d'utilisateur") ou ("mot de passe"), ils seront sérialisés avec cette clé

si sérialisé

{"username":"trinadh","password":"hello"}

si non

{"name":"trinadh","password":"hello"}
11
Trinadh Koya

De plus, @Expose vient avec deux drapeaux booléens : deserialize et serialize, pour permettre de sauter le champ pendant une phase.

4
Shubham