返回前端页面的属性名称和实体类的名称不一致用@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;  
}  

posted @ 2020-07-14 09:45  红尘沙漏  阅读(2645)  评论(0编辑  收藏  举报