Gson: @Expose против @SerializedName

Что касается Gson, в чем разница между @Expose и @SerializedName("stringValue")?

Ответ 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"}