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】:即使为时已晚,我也想回答这个问题。
要解释它,我们必须知道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
【讨论】:
@Kwnstantinos 很高兴为您提供帮助! 谢谢。当我们将序列化设置为 false 时,序列化后我们将看不到 json 字符串中的用户名。但是一瞬间。假设我们将用户名反序列化设置为 false。所以当我们反序列化我们的 json 时,我们会得到用户名 null。我说的对吗? @Bek: 可爱的解释 如果我们没有为 Expose 注释指定任何值,默认值为 true。【参考方案2】:@SerializeName
用于设置 json 对象将包含的键,而@Expose
用于决定是否将变量公开用于序列化和反序列化。 Here's@Expose
的文档。
【讨论】:
如果我们同时拥有Expose
和SerializeName
会怎样?
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: deserialize
和 serialize
,允许跳过一个阶段的字段。
【讨论】:
以上是关于Gson:@Expose 与 @SerializedName的主要内容,如果未能解决你的问题,请参考以下文章
Gson 试图解析带有 @Expose(false) 注释的字段并崩溃