【发布时间】:2016-04-17 13:43:48
【问题描述】:
关于 Gson,@Expose 和 @SerializedName("stringValue") 有什么区别?
【问题讨论】:
-
@MarkKeen,嘿伙计,链接坏了。
-
如果我们没有为 Expose 注释指定任何值,默认值为 true。
关于 Gson,@Expose 和 @SerializedName("stringValue") 有什么区别?
【问题讨论】:
即使为时已晚,我也想回答这个问题。
要解释它,我们必须知道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
}
【讨论】:
@SerializeName 用于设置 json 对象将包含的键,而@Expose 用于决定是否将变量公开用于序列化和反序列化。 Here's@Expose的文档。
【讨论】:
Expose 和SerializeName 会怎样?
Expose 在极少数情况下使用,可以删除
@Expose 中传递的值。 (它的完整语法是 @Expose(serialize = <true/false>,deserialize = <true/false>) ,其中 true 是两者的默认值。
class Person{
String name;
String password;
}
假设如果我将 i 注释 Expose 放在没有 SerializedName 的变量名或密码之上,它将被序列化为 AS 变量名
但是如果我们把 SerializedName 像 ("username") 或 ("password") 一样,它们将用那个键序列化
如果序列化
{"username":"trinadh","password":"hello"}
如果没有
{"name":"trinadh","password":"hello"}
【讨论】:
此外,@Expose comes with two boolean flags: deserialize 和 serialize,允许跳过一个阶段的字段。
【讨论】: