@JsonIgnore @JsonIgnoreProperties 这两个jackson注解作用是什么?
@JsonIgnore 和 @JsonIgnoreProperties 都是 Jackson 库中用于控制 JSON 序列化/反序列化的注解,但它们的作用范围和使用方式不同:
1. @JsonIgnore
作用
- 标注在单个字段或 getter/setter 方法上
- 忽略特定的属性,使其不参与序列化(Java对象→JSON)和/或反序列化(JSON→Java对象)
使用示例
JAVA
public class User {
private String username;
@JsonIgnore
private String password; // 不会出现在 JSON 中
@JsonIgnore
public String getSecretData() {
return "敏感信息";
}
}
特点
- 粒度较细,精确控制单个属性
- 只能用在字段或方法上
2. @JsonIgnoreProperties
作用
- 标注在类级别
- 批量忽略多个属性
- 可以控制序列化、反序列化或两者都忽略
使用示例
JAVA
@JsonIgnoreProperties({"password", "salt"}) // 忽略多个字段
public class User {
private String username;
private String password; // 会被忽略
private String salt; // 会被忽略
private String email;
}
// 更精细的控制
@JsonIgnoreProperties(
value = {"password"}, // 序列化时忽略
ignoreUnknown = true // 反序列化时忽略未知属性
)
public class User {
// ...
}
常用参数
JAVA
@JsonIgnoreProperties(
value = {"prop1", "prop2"}, // 要忽略的属性列表
ignoreUnknown = true, // 反序列化时忽略JSON中的未知字段
allowGetters = false, // 是否允许getter方法
allowSetters = true // 是否允许setter方法
)
主要区别对比
| 特性 | @JsonIgnore | @JsonIgnoreProperties |
|---|---|---|
| 作用级别 | 字段/方法级别 | 类级别 |
| 控制粒度 | 单个属性 | 多个属性 |
| 配置位置 | 分散在属性上 | 集中在类声明处 |
| 功能 | 相对简单 | 功能更丰富(支持忽略未知属性等) |
使用场景建议
使用 @JsonIgnore
JAVA
// 适合:只需要忽略少数几个敏感字段
public class User {
private String id;
private String name;
@JsonIgnore // 只忽略这一个敏感字段
private String ssn; // 社会安全号
// 其他字段正常序列化
}
使用 @JsonIgnoreProperties
JAVA
// 适合:需要批量管理或特殊配置
@JsonIgnoreProperties(
value = {"createdBy", "updatedBy", "version"}, // 批量忽略审计字段
ignoreUnknown = true // 忽略前端多传的字段
)
public class ProductDTO {
private String id;
private String name;
private Double price;
// 审计字段会被自动忽略
private String createdBy;
private String updatedBy;
}
组合使用
JAVA
@JsonIgnoreProperties({"internalCode"}) // 类级别忽略
public class Order {
private String orderNo;
@JsonIgnore // 方法级别额外忽略
public String getInternalInfo() {
return "内部信息";
}
}
注意事项
- @JsonIgnoreProperties 优先级更高:如果同时使用,类级别的配置会覆盖字段级别的
- 继承关系:
@JsonIgnoreProperties默认不会被子类继承,除非配置inherit = true - 性能考虑:
ignoreUnknown = true可以防止反序列化时因多余字段而报错,但可能会隐藏问题
选择哪个注解取决于你的具体需求:需要精细控制单个属性用 @JsonIgnore,需要批量管理或特殊配置用 @JsonIgnoreProperties。