GSON: @Expose vs @SerializedName

относительно GSON в чем разница между @Expose и @SerializedName("stringValue")?

4 ответов


@Expose
String myString;  // will be serialized as myString


@SerializedName("m_s")
String myString; // will be serialized as m_s

class Person{
String name;
String password;
}

предположим, если я поставлю аннотацию разоблачение поверх имени переменной или пароля без SerializedName, он будет сериализован как переменная name

но если мы ставим SerializedName как ("имя пользователя") или ("пароль"), они будут сериализованы с этим ключом

Если сериализованные

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

, если не

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

даже если уже поздно, я хотел ответить на этот вопрос. Чтобы объяснить это, мы должны знать, что такое 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 не будет десериализован. значение имени пользователя будет null.

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

ниже userName не будет сериализован.

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

строка Json будет такой. Только userAge будет десериализован.

{
    "age":30
}

кроме того, @Expose поставляется с двумя булевыми флагами: deserialize и serialize, чтобы пропустить поле для одной фазы.