Gson:@Expose 与 @SerializedName

Posted

技术标签:

【中文标题】Gson:@Expose 与 @SerializedName【英文标题】:Gson: @Expose vs @SerializedName 【发布时间】:2016-04-17 13:43:48 【问题描述】:

关于 Gson,@Expose@SerializedName("stringValue") 有什么区别?

【问题讨论】:

@MarkKeen,嘿伙计,链接坏了。 更新链接(另一个谷歌搜索)websystique.com/java/json/gson-json-annotations-example 如果我们没有为 Expose 注释指定任何值,默认值为 true。 【参考方案1】:

即使为时已晚,我也想回答这个问题。 要解释它,我们必须知道serializationdeserialization 是什么。 serialization 正在将 object 转换为 json stringdeserialization 正在将 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 用于允许或禁止serializationdeserialization@Expose 是可选的,它有两个配置参数:serializedeserialize。默认情况下,它们设置为 true。 到 serializedeserialize@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

【讨论】:

@Kwnstantinos 很高兴为您提供帮助! 谢谢。当我们将序列化设置为 false 时,序列化后我们将看不到 json 字符串中的用户名。但是一瞬间。假设我们将用户名反序列化设置为 false。所以当我们反序列化我们的 json 时,我们会得到用户名 null。我说的对吗? @Bek: 可爱的解释 如果我们没有为 Expose 注释指定任何值,默认值为 true。【参考方案2】:

@SerializeName 用于设置 json 对象将包含的键,而@Expose 用于决定是否将变量公开用于序列化和反序列化。 Here's@Expose的文档。

【讨论】:

如果我们同时拥有ExposeSerializeName 会怎样? Expose 在极少数情况下使用,可以删除 @HamzehSoboh 那么它将取决于@Expose 中传递的值。 (它的完整语法是 @Expose(serialize = <true/false>,deserialize = <true/false>) ,其中 true 是两者的默认值。【参考方案3】:
class Person
String name;
String password;

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

但是如果我们把 SerializedName 像 ("username") 或 ("password") 一样,它们将用那个键序列化

如果序列化

"username":"trinadh","password":"hello"

如果没有

"name":"trinadh","password":"hello"

【讨论】:

【参考方案4】:

此外,@Expose comes with two boolean flags: deserializeserialize,允许跳过一个阶段的字段。

【讨论】:

以上是关于Gson:@Expose 与 @SerializedName的主要内容,如果未能解决你的问题,请参考以下文章

如何实现 Gson 序列化/反序列化过程中 过滤指定字段

Gson 试图解析带有 @Expose(false) 注释的字段并崩溃

Gson——如何忽略用@Expose标记的字段

通过Gson过滤多余的字段

使用 DEFAULT_SERIALIZE_NULLS 值时不会跳过 Retrofit2/Gson 空值

你真的会用Gson吗?Gson使用指南