Что касается 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, чтобы пропускать поле для одной фазы.