Gson:@Expose vs @SerializedName

Ahm*_*med 52 java android json gson

关于Gson @Expose@SerializedName("stringValue")?之间的区别是 什么?

Bek*_*Bek 81

即使已经很晚了,我也想回答这个问题.为了解释它,我们必须知道什么是serializationdeserialization. serialization正在转变objectjson stringdeserialization正在转变json stringobject.

假设我们User上课时没有注释.

public class User{
    private String userName;
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们serialize这个object如下

User user = new User("Ahmed", 30);
Gson gson = new Gson();
String jsonString = gson.toJson(user);
Run Code Online (Sandbox Code Playgroud)

Json字符串将是这样的

{
    "userName":"Ahmed",
    "userAge":30
}
Run Code Online (Sandbox Code Playgroud)

如果我们添加注释 @SerializedName

public class User{

    @SerializedName("name")
    private String userName;
    @SerializedName("age")
    private Integer userAge;

    public User(String name, Integer age){
        userName = name;
        userAge = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

Json字符串将是这样的

{
    "name":"Ahmed",
    "age":30
}
Run Code Online (Sandbox Code Playgroud)

@Expose用于允许或禁止serializationdeserialization. @Expose是可选的,它有两个配置参数:serializedeserialize.默认情况下,它们设置为true.为了serializedeserialize@Expose我们建立GSON对象这样

Gson gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Run Code Online (Sandbox Code Playgroud)

下面userName不会反序列化.userName的值将是null.

@SerializedName("name")
@Expose(deserialize = false)
private String userName;
Run Code Online (Sandbox Code Playgroud)

下面userName不会被序列化.

@SerializedName("name")
@Expose(serialize = false)
private String userName;
Run Code Online (Sandbox Code Playgroud)

Json字符串将是这样的.只会userAge被反序列化.

{
    "age":30
}
Run Code Online (Sandbox Code Playgroud)


Gav*_*iel 79

@SerializeName用于设置json对象将包含的键,但是@Expose用于决定是否将为序列化和反序列化公开变量.这是文档@Expose.

  • 如果我们同时拥有`Expose`和`SerializeName`怎么办? (40认同)
  • ```Expose``` 在极少数情况下使用,可以将其删除 (2认同)
  • @HamzehSoboh 那么它将取决于“@Expose”中传递的值。(其完整语法为 `@Expose(serialize = <true/false>,deserialize = <true/false>)` ,其中 true 是两者的默认值。 (2认同)

Tri*_*oya 11

class Person{
String name;
String password;
}
Run Code Online (Sandbox Code Playgroud)

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

但是如果我们将SerializedName设置为(" username ")或(" password "),它们将使用该密钥序列化

如果序列化

{"username":"trinadh","password":"hello"}
Run Code Online (Sandbox Code Playgroud)

如果不

{"name":"trinadh","password":"hello"}
Run Code Online (Sandbox Code Playgroud)


小智 5

此外,还@Expose带有两个布尔标志:deserializeserialize允许跳过一个阶段的字段.