Что касается Gson, в чем разница между @Expose
и @SerializedName("stringValue")
?
Gson: @Expose против @SerializedName
Ответ 1
@SerializeName
используется для установки ключа, который будет включать объект json, однако @Expose
используется для определения, будет ли переменная отображаться для сериализации и десериализации или нет. Вот документация @Expose
.
Ответ 2
Даже если уже поздно, я хотел бы ответить на этот вопрос. Чтобы объяснить это, мы должны знать, что такое serialization
и deserialization
. serialization
преобразовывает object
в json string
а deserialization
- преобразование json string
в object
.
Допустим, у нас есть User
класс без аннотаций.
public class User{
private String userName;
private Integer userAge;
public User(String name, Integer age){
userName = name;
userAge = age;
}
}
И мы serialize
этот object
как показано ниже
User user = new User("Ahmed", 30);
Gson gson = new Gson();
String jsonString = gson.toJson(user);
Строка Json будет такой
{
"userName":"Ahmed",
"userAge":30
}
Если мы добавим аннотацию @SerializedName
public class User{
@SerializedName("name")
private String userName;
@SerializedName("age")
private Integer userAge;
public User(String name, Integer age){
userName = name;
userAge = age;
}
}
Строка Json будет такой
{
"name":"Ahmed",
"age":30
}
@Expose
используется для разрешения или запрета serialization
и deserialization
. @Expose
является необязательным и имеет два параметра конфигурации: serialize
и deserialize
. По умолчанию они установлены в true. Чтобы serialize
и deserialize
с помощью @Expose
мы создаем объект gson следующим образом.
Gson gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Ниже userName
не будет десериализовано. Значение userName будет null
.
@SerializedName("name")
@Expose(deserialize = false)
private String userName;
Ниже userName
не будет сериализовано.
@SerializedName("name")
@Expose(serialize = false)
private String userName;
Строка Json будет такой. Только userAge
будет десериализован.
{
"age":30
}
Ответ 3
class Person{
String name;
String password;
}
предположим, что если я помещаю аннотацию Expose поверх имени переменной или пароля без SerializedName, это будет сериализованное имя переменной AS
Но если мы поместим SerializedName как ( " имя пользователя" ) или ( " пароль" ), они будут сериализованы с помощью этой клавиши
если Serialized
{"username":"trinadh","password":"hello"}
если не
{"name":"trinadh","password":"hello"}
Ответ 4
Кроме того, @Expose
поставляется с двумя булевыми флагами: deserialize
и serialize
, чтобы пропускать поле для одной фазы.