En ce qui concerne Gson, quelle est la différence entre @Expose
Et @SerializedName("stringValue")
?
@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
.
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
}
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"}
De plus, @Expose
vient avec deux drapeaux booléens : deserialize
et serialize
, pour permettre de sauter le champ pendant une phase.