举例说明
假设我们有个用户类,其中的属性有用户名和密码。那么通常我们不使用@JsonView注解的时候序列化都是把密码序列化的。但是一般情况我们都不希望密码暴露,但有时候又会想去传输密码。那么现在就需要两种view来进行传输。其中一种只有用户名,另一种在用户名的基础上还包括了密码。
这个是@JsonView注解就很容易的实现这个。
根据上述的例子,通过@JsonView去实现
用户类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
// 定义一个接口,表示视图,用户区分属性
public interface UserSimpleView {};
// 第二个接口是在第一个视图上加上了该视图所特有的属性
public interface UserDetailView extends UserSimpleView {};
// 使用@JsonView注解,表示这个属性在哪个视图中
@JsonView(UserSimpleView.class)
private String name;
@JsonView(UserDetailView.class)
private String password;
}
在controller方法上指定视图
@GetMapping("/findUserBySimpleView")
// 在不同情况下使用不同接口
@JsonView(User.UserSimpleView.class)
public User findUserBySimpleView(@RequestParam(value="id")String number) {
User user=new User();
user.setPassword(number);
user.setName("cvzhanshi");
return user;
}
@JsonView(User.UserDetailView.class)
@GetMapping("/findUserByDetailView")
public User findUserByDetailView(@RequestParam(value="id")String number) {
User user=new User();
user.setPassword(number);
user.setName("cvzhanshi");
return user;
}
结果
第一个接口返回值
{
"name": "cvzhanshi"
}
第二个接口返回值
{
"name": "cvzhanshi",
"password": "123"
}
如此便很轻易的实现了分情况返回视图
第二种使用方法也是我在工作中看到两句不懂的代码,百度学习到的。刚好也介绍一下。
ObjectMapper om = new ObjectMapper();
om.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
代码示例
public class MainSummaryViewDeserialization {
public static void main(String[] args) throws JsonProcessingException {
User user = new User("cvzhanshi", "123456");
System.out.println("---------------不使用om---------------");
System.out.println(user.toString());
ObjectMapper om = new ObjectMapper();
System.out.println("---------------使用om,不使用view---------------");
String asString = om.writeValueAsString(user);
System.out.println(asString);
om.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
System.out.println("---------------使用om,UserSimpleView,---------------");
String simpleString = om.writerWithView(User.UserSimpleView.class).writeValueAsString(user);
System.out.println(simpleString);
System.out.println("---------------使用om,UserDetailView,---------------");
String detailString = om.writerWithView(User.UserDetailView.class).writeValueAsString(user);
System.out.println(detailString);
}
}
输出结果
---------------不使用om---------------
User(name=cvzhanshi, password=123456)
---------------使用om,不使用view---------------
{"name":"cvzhanshi","password":"123456"}
---------------使用om,UserSimpleView,---------------
{"name":"cvzhanshi"}
---------------使用om,UserDetailView,---------------
{"name":"cvzhanshi","password":"123456"}
不管那种使用方法,它的作用就是控制输入输出后的json的属性种类。通过@JsonView来控制传出去,传进来的实体类属性