@JsonIgnore彻底屏蔽字段读写,@JsonProperty(access=...)精细控制单向权限,@JsonIgnoreProperties批量忽略类级别字段;密码用WRITE_ONLY、ID用READ_ONLY、内部字段用JsonIgnore。

Spring Boot 中通过 @JsonIgnore 和 @JsonProperty 控制 JSON 序列化,核心在于区分“要不要传出去”和“字段叫什么名”两件事。两者作用不同,混用还容易出问题,得理清边界再用。
@JsonIgnore:彻底屏蔽字段的读写
加在字段、getter 或 setter 上,会让 Jackson 在序列化(Java → JSON)和反序列化(JSON → Java)两个方向都跳过该字段。
- 适合完全不参与数据流转的内部字段,比如临时计算标记、缓存键等
- 不推荐用于密码类场景——它既不让前端看到密码,也不让后端接收到密码,导致注册/登录无法赋值
- 若同时加了
@JsonProperty("xxx"),@JsonIgnore可能失效,字段仍会出现在 JSON 中
@JsonProperty(access = …):精细控制读写权限
这是解决“只接收不返回”或“只返回不接收”的关键。它允许你单独指定字段在序列化和反序列化中的行为:
-
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY):仅接受前端传入(如密码、验证码),但响应中绝不返回 -
@JsonProperty(access = JsonProperty.Access.READ_ONLY):仅在响应中输出(如自增 ID、状态码描述),但禁止前端提交修改 -
@JsonProperty("user_name")单独使用:仅重命名字段,不影响读写权限,默认仍是 READ_WRITE
@JsonIgnoreProperties:批量忽略类级别字段
加在类上,一次性屏蔽多个字段,比每个字段都加 @JsonIgnore 更简洁:
-
@JsonIgnoreProperties({"password", "salt", "createTime"}):这些字段在所有接口中都不参与序列化与反序列化 -
@JsonIgnoreProperties(ignoreUnknown = true):反序列化时忽略 JSON 中存在但 Java 类里没有的字段,防止报错 - 注意:它不能实现“只写不读”,仍需配合
@JsonProperty(access = WRITE_ONLY)
实际组合建议
一个典型用户实体中,常见写法如下:
public class User {
private Long id;
private String username;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long createTime;
@JsonIgnore
private String internalToken;
// getter/setter...
}
- 注册时提交
{"username":"abc","password":"123"}→ password 能正常设进对象 - 查询用户时返回
{"id":1,"username":"abc","createTime":1726426020000}→ password 和 internalToken 都不出现 - createTime 不会被前端修改,但每次响应都带上


















