場景:比如前端要求你返回一個json數據類型,但是這個json類型的里面屬性有的值重復了,比如
{
name:zhangsan,
age:12,
teacher:[
name:Mrs Liu
subject:math
]
}
就像這樣,出現了兩個name,但是前端就是要求這樣傳的,很蛋疼有沒有,都是name,時間長了就不知道啥意思了,所以,咱們有解決一下
@JsonProperty("name")
private String teacherName;
在這篇文章中,我們將介紹如何將多個字段名稱映射到一個字段屬性上。如果你的應用有多個接口數據,那么使用 @SerializedName 注解就可以解決,你仍然可以使用原來的model類,而不必增加新的model類。
@SerializedName 延伸
在第一個 @SerializedName 注解文章中,基本用法如下:
public class UserSimple {
給 Model 變量添加注解,並可以序列化和反序列化。
但是,還不能滿足我們的需求,SerializedName 接受兩個參數,value、alternate,第一個value是默認參數,如果你只填了一個參數,那這個值將會賦值給 value,第二個 alternate 就為空,同樣都填上也是ok的。
public class UserSimpleSerializedName { @SerializedName(value = "fullName", alternate = "username") private String name; private String email; private boolean isDeveloper; private int age; }
SerializedName 改變了默認序列化和默認反序列化的字段取值,所以,如果你使用 Gson 將 Java model 類生稱 JSON 串,結果就是 value 的名稱就是字段的名稱。
alternate 屬性是用在反序列化上的,也就是說從 JSON 到 Java 類的過程。Gson 會幫我們匹配 JSON 中的命名,並嘗試找到一個字段映射。對於上面例子model類中,Gson 會將字段 fullname 或者 username 映射到字符串 name上。無論哪一個都會映射。
如果在 model 中給變量使用了 @SerializedName 的兩個屬性,那么最終會返回相同的 Java 對象,例如:
{
'fullName': 'Norman',
'email': 'norman@futurestud.io'
}
{
'username': 'Norman',
'email': 'norman@futurestud.io'
}
再來看一個例子:
{
'username': 'Norman',
'fullName': 'Marcus',
'email': 'norman@futurestud.io'
}
如果多個字段匹配一個變量字段,誰在后面Gson就會將值賦給誰,結果最終是 name:Marcus。
public class User {
@JsonProperty(value = "Name")
private String name;
@JsonProperty(value = "Age")
private int age;
}