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

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

【问题讨论】:

标签: java android json gson


【解决方案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,允许跳过一个阶段的字段。

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多