Gson:@Expose与@SerializedName


Answers:


161

即使很晚,我也想回答这个问题。为了解释它,我们必须知道什么是serializationdeserializationserialization正在转换object为,json string并且deserialization正在转换json stringobject

假设我们的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用于允许和禁止serializationdeserialization@Expose是可选的,它具有两个配置参数:serializedeserialize。默认情况下,它们设置为true。为了serializedeserialize@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
}

1
@Kwnstantinos很高兴为您服务!
Bek

谢谢。当我们将序列化设置为false时,序列化之后我们将无法在json字符串中看到用户名。但是片刻。假设我们将用户名反序列化设置为false。因此,当我们反序列化json时,我们将获得用户名null。我对吗?
Hayk Mkrtchyan

@贝克:可爱的解释
motherazrael

89

@SerializeName用于设置json对象将包含的密钥,但是@Expose用于决定是否对变量公开以进行序列化和反序列化。这是的文档@Expose


43
如果我们同时拥有ExposeSerializeName怎么办?
Hamzeh Soboh,

1
Expose在极少数情况下使用,可以将其删除
Ali Rezaiyan

@HamzehSoboh然后它将取决于传入的值@Expose。(其完整的语法@Expose(serialize = <true/false>,deserialize = <true/false>),其中true是默认两者。
ANSH sachdeva

13
class Person{
String name;
String password;
}

假设如果我在没有SerializedName的变量名或密码上添加我的注释Expose,它将被序列化为AS变量名

但是,如果我们将SerializedName像(“ username ”)或(“ password ”)这样放置,它们将使用该密钥进行序列化

如果序列化

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

如果不

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.