@jsonview 是 jackson 的视图控制机制,通过标记接口和注解实现序列化时的字段按需过滤,支持视图继承、嵌套对象与集合的分层控制,不改变对象本身。

@JsonView 是 Jackson 提供的视图控制机制,用于在序列化(如 REST 接口返回 JSON)时按需过滤对象字段,避免手动写 DTO 或用 @JsonIgnore 硬编码。它不改变 Java 对象本身,只影响 JSON 输出结构。
定义视图类(View Classes)
视图类是普通空接口(或抽象类),仅作标记用途,推荐用静态内部接口提升可读性和作用域控制:
public class User {
public interface Basic {}
public interface Detail extends Basic {}
private Long id;
private String username;
private String email;
private String password; // 敏感字段
private LocalDateTime createdAt;
// getter/setter...
}
这里 Detail 继承 Basic,表示“详细视图包含基础视图字段”,支持视图层级复用。
在实体类上标注 @JsonView
把视图接口加在字段或 getter 方法上,决定该字段在哪些视图中可见:
public class User {
public interface Basic {}
public interface Detail extends Basic {}
@JsonView(Basic.class)
private Long id;
@JsonView(Basic.class)
private String username;
@JsonView(Detail.class) // 仅 Detail 视图可见
private String email;
@JsonView(Detail.class)
private LocalDateTime createdAt;
@JsonView(Detail.class)
private String password; // 注意:生产中不建议这样暴露密码字段!
}
⚠️ 关键规则:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 未标注
@JsonView的字段默认**任何视图都不输出**(Jackson 2.6+ 默认行为) - 若想让某字段在所有视图都出现,可标
@JsonView({Basic.class, Detail.class})或定义一个公共父接口(如All.class) - 推荐只标在 getter 上(更符合封装原则),避免直接标在字段上影响 Lombok 的
@Data
在 Controller 方法上指定生效视图
使用 @JsonView 注解修饰 Handler 方法,告诉 Jackson 当前响应应采用哪个视图序列化:
@RestController
public class UserController {
@GetMapping("/user/{id}")
@JsonView(User.Detail.class) // 返回完整字段(含 email、createdAt、password)
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
@GetMapping("/users")
@JsonView(User.Basic.class) // 只返回 id、username
public List<user> listUsers() {
return userService.findAll();
}
}</user>
注意:@JsonView 作用于整个响应体,对 ResponseEntity、泛型集合、嵌套对象均生效。嵌套对象也需在其自身类中标注对应视图才起作用。
处理嵌套对象与集合的视图继承
如果 User 包含 Address address 字段,且 Address 也有视图控制:
-
address字段需标注@JsonView(如@JsonView(User.Detail.class))才能被包含 -
Address类内部字段也要标注对应视图(如Address.Public.class),并确保其视图与外层调用匹配 - 集合字段(如
List<role> roles</role>)同理,需在字段和Role类中分别配置
视图不自动穿透,必须显式声明每一层的可见性,这是精确控制的关键,也是易错点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










