返回前端页面的属性名称和实体类的名称不一致用@JsonProperty @SerializedName
场景:比如前端要求你返回一个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;
}